【问题标题】:Trouble with inheritance: Using pointers with class instantiation not working as expected [duplicate]继承问题:使用类实例化的指针不能按预期工作[重复]
【发布时间】:2012-08-12 20:14:28
【问题描述】:

我收到了错误 undefined reference to 'vtable for Base'。我不知道这意味着什么,因为我没有使用任何称为“vtable”的东西。另外,我不完全理解制作指针和new Derived 是如何影响程序的。任何人都可以清除这个吗?谢谢。

#include <iostream>

using std::cout;

class Base { // undefined reference to 'vtable for Base'

    public:
        void f();
        virtual void bar();

};
class Derived : public Base {
    public:
        void f();
        void bar() {
            cout << "I am bar";
        }
};

int main() {

    Derived d;
    Base * b = &d;

    b->bar();

}

【问题讨论】:

    标签: c++


    【解决方案1】:

    您必须实现您实例化的类的virtual 函数才能编译。 (或标记它们pure virtual)。

    只需在Base 中将bar 设为空即可:

    virtual void bar() {}
    

    pure virtual(必须在派生类中重新实现才能实例化它们)

    virtual void bar() = 0;
    

    【讨论】:

    • 谢谢。这行得通。不过我有几个问题:继承时,当你执行class Derived : Barclass Derived public Barclass Derived : protected Barclass Derived : private Bar 时会发生什么。还有,new Derived 是做什么的?
    • @user6607:1.stackoverflow.com/questions/860339/…。 2. 在堆上分配对象。我建议你选择一本 c++ 书
    • @user6607 回答这些问题,搜索 stackoverflow,如果找不到答案,请询问。但一次只有一个问题。
    【解决方案2】:

    你有两个问题。首先,将Base中的方法设为纯虚拟:

    class Base {
        public:
            virtual void f()=0;
            virtual void bar()=0;
    };
    

    其次,需要实现f()

    class Derived : public Base {
        public:
            void f(){}
            void bar() {}
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-17
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多