从基类调用继承类的重载函数

时间:2013-11-25 06:23:05

标签: c++

#include<iostream>

class A {
    public:
        void init(){
                std::cout << "A" << std::endl;
        }
};
class B: public A {
    public:
    void init(){
            std::cout << "B" << std::endl;
    }
};
int main() {
        A *o = new B();

/*

Some codes here

*/
        o->init();
        return 0;
}

结果:

在上面的程序中,被调用的init是A类。如何调用B类的init函数?

编辑:我需要同时调用init。我不能改变A和B类。而且我必须在main中制作类似的对象声明。

5 个答案:

答案 0 :(得分:4)

init()中将Class A功能虚拟化。

class A {
    public:
        virtual void init(){
                std::cout << "A" << std::endl;
        }
};

对象o包含两部分。 base partderived part。如果你想从B::init()调用o,那么你必须告诉编译器它是一个虚函数,它应该在派生类中查找函数重载。

我建议您浏览本网站上的教程,以了解有关继承的更多信息: http://www.learncpp.com/cpp-tutorial/113-order-of-construction-of-derived-classes/

答案 1 :(得分:0)

你有一些选择:

B *o = new B(); // in Main

(B *)o->init(); // in Main

virtual void init(){
                       std::cout << "A" << std::endl;
                   } // in Class A

答案 2 :(得分:0)

b = dynamic_cast<B*>(o);
if(b!=NULL)
   b->init();

这将调用B类对象的函数。

答案 3 :(得分:0)

使init函数虚拟化 创建一个A类指针 创建一个B类的对象 将B对象的地址分配给指针A. 现在访问B的初始化函数

答案 4 :(得分:0)

由于B类在其基类中隐藏了init()的定义,因此它将使该函数对可能从中调用该函数的任何指针或引用的类型敏感。 正如您提到的A和B是预先编写的类,您可以实例化指向B类的指针,或者转换为指向B类的指针。