C+的遗传与多态性+; 我的问题是关于C++中的继承和多态性。 class Base { public: virtual void f() { cout << "Base::f()" << endl; }

C+的遗传与多态性+; 我的问题是关于C++中的继承和多态性。 class Base { public: virtual void f() { cout << "Base::f()" << endl; } ,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,C+的遗传与多态性+; 我的问题是关于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

C+的遗传与多态性+; 我的问题是关于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;
}
类基
{
公众:

在这种情况下,您需要告诉C++,您希望在派生类中包含“代码> f>代码”的基类定义。
class Derivate1: public Base
{
public:
  using Base::f;
  ...
};

class Derivate2: public Base
{
public:
  using Base::f;
  ...
};

<>这基本上告诉C++编译器在进行名称查找时既要包含派生类也要包含<代码> f>代码>的父类定义。没有这个C++编译器将基本上停止在层次结构中的第一个类型,它有一个名为“代码> f< /Cord>的成员,只考虑在该类型中声明的重载。

< P>C++是UU。ally对这种类型的继承非常严格,如果您想解决这个问题,可以使用它来解决类似以下问题
d1.f();

static_cast<Base*>(&d1)->f("string");

这只适用于直接派生对象访问,而不适用于基指针。@RaduGabor基指针的问题是不能“注入”新方法与您尝试的方式相同。如果您希望通过基指针调用方法,则必须在基类中声明该方法。
使用
是其他情况下的正确解决方案。可能重复
class Base
{
public:
  //...
    virtual void f(int i) { printf("Base::f(int)"); }
};