Можно перегрузить. Однако, чтобы создать экземпляр SubClass надо в нем все таки определить memfunc(char *str). Также в предложенном коде есть неточность – функция memfunc(double d) не будет виртуальной, это можно наглядно понять из этого кода (этот код аналогичен первичному, за исключением необходимо определенной memfunc(char *str) ):
Код | #include <iostream>
class A { public: virtual void memfunc(char *str) = 0; };
class B: public A { public: void memfunc(double d) // это не виртуальная функция { std::cout << "memfunc(double d): B" << std::endl; }
void memfunc(char *str) // чтобы создать экземпляр этого класса, надо определить эту функцию { std::cout << "memfunc(char *str): B" << std::endl; } };
class C: public B { public: void memfunc(char *str) { std::cout << "memfunc(char *str): C" << std::endl; }
void memfunc(double d) { std::cout << "memfunc(double d): C" << std::endl; } };
int main() { A *a; B b; C c; a = &b; a->memfunc(0);
a = &c; a->memfunc(0);
B *p; p = &b; p->memfunc(0.); p = &c; p->memfunc(0.); // указатель имеет тип B, поэтому будет вызвана функция B::memfunc(double d)
return 0; }
|
Предполагаю, что в итоге хотелось увидеть примерно это (вариант перегрузки виртуальной функции в классе-наследнике):
Код | #include <iostream>
class A { public: virtual void memfunc(char *str) { std::cout << "memfunc(char *str)::A" << std::endl; }
virtual void memfunc(double d) { std::cout << "memfunc(double d)::A" << std::endl; } };
struct ST {char bb;};
class B: public A { public: virtual void memfunc(ST bb) // перегружаем, ключевое слово virtual здесь необходимо { std::cout << "memfunc(ST bb)::B" << std::endl; }
void memfunc(double d) // переопределяем { std::cout << "memfunc(double d)::B" << std::endl; } };
class C: public B { public: void memfunc(char *str) // переопределяем { std::cout << "memfunc(char *str)::C" << std::endl; }
void memfunc(double d) // переопределяем { std::cout << "memfunc(double d)::C" << std::endl; }
void memfunc(ST bb) // переопределяем { std::cout << "memfunc(ST bb)::C" << std::endl; } };
int main() { A a, *pa; B b, *pb; C c; ST s;
pa = &a; pa->memfunc((char *)0); pa->memfunc(0.);
std::cout << std::endl;
pa = pb = &b; pa->memfunc((char *)0); // она не была переопределена в производном классе pa->memfunc(0.); pb->memfunc(s); // pa нельзя использовать, т.к. он ничего не знает о memfunc(ST bb) std::cout << std::endl;
pa = pb = &c; pa->memfunc((char *)0); pa->memfunc(0.); pb->memfunc(s); return 0; }
|
|