我的问题是关于C ++中的继承和多态。
class Base
{
public:
virtual void f() { cout << "Base::f()" << endl; }
void f(string s) { cout << "Base::f(string)" << endl; }
};
class Derivate1: public Base
{
public:
void f() { cout << "Derivate1::f()" << endl; }
void f(int i) { cout << "Derivate1::f(int)" <<endl; }
};
class Derivate2: public Base
{
public:
void f() { cout << "Derivate2::f()" << endl; }
void f(char c) { cout << "Derivate2::f(char)" << endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
//with base pointers
Derivate1 d1;
Derivate2 d2;
Base *b1 = &d1;
Base *b2 = &d2;
b1->f(); //output: Derivate1::f() ok.
b1->f("string"); //output: Base::f(string) ok.
b1->f(1); //error !
b2->f(); //output: Derivate2::f() ok.
b2->f("string"); //output: Base::f(string) ok.
b2->f('c'); //error !
//with direct derivate object
d1.f(); //output: Derivate1::f() ok.
d1.f("string"); //error !
d1.f(1); //output: Derivate1::f(int) ok.
d2.f(); //output: Derivate2::f() ok.
d2.f("string"); //error !
d2.f('c'); //output: Derivate2::f(char) ok.
return 0;
}
如果我想在派生对象中可以访问的基类中使用重新定义的函数,我该怎么办?我不想在派生类中使用Base::f;
。
答案 0 :(得分:2)
在这种情况下,您需要告诉C ++您希望在派生类中包含f
的基类定义。这是通过using
语句
class Derivate1: public Base
{
public:
using Base::f;
...
};
class Derivate2: public Base
{
public:
using Base::f;
...
};
这实质上告诉C ++编译器在进行名称查找时包含f
的派生类和父类定义。如果没有这个,C ++编译器将基本停止在层次结构中的第一个类型,该类型具有名为f
的成员,并且仅考虑在该类型中声明的重载。
答案 1 :(得分:0)
C ++对这种类型的继承通常非常严格,如果您想要一个解决方法,可以使用它来解决这样的问题d1.f();
:
static_cast<Base*>(&d1)->f("string");
如果您想拨打这样的电话:b1->f(1);
那么......你不能。这就是多态性的全部要点。您必须在Base
类中声明一个具有名为f(int i)
的方法的虚方法,以便编译器可以链接Base
类方法和Derivate1
类方法:
class Base
{
public:
//...
virtual void f(int i) { printf("Base::f(int)"); }
};