【问题标题】:about inheritance in C++, can a derived class get implemetation from base class without explicitly defining it关于 C++ 中的继承,派生类能否在不显式定义的情况下从基类实现
【发布时间】:2013-05-21 18:44:38
【问题描述】:

以下有错误

错误 LNK2001:无法解析的外部符号“public: virtual void __thiscall C::Foo(void)”(?Foo@C@@UAEXXZ)

所以基本上C::Test() 不能自动继承B::Test() 的实现,我们必须每次都用 C++ 显式编写它?

class A
{

public:  
    virtual void Foo()=0;
    virtual void Test()=0;

};

class B: public A 
{
public: 
    virtual void Foo();
    virtual void Test()=0;

};

void B::Foo()
{

}



class C: public B
{
public:
    void Foo();
    void Test();
};



void C::Test()
{
}

【问题讨论】:

  • 至少一个派生类必须实现在基类中声明的纯虚函数。

标签: c++ inheritance virtual


【解决方案1】:

如果你的派生类从父类声明了一个虚方法,就像Cvoid Foo() 所做的那样,那么它也必须实现它。如果你想继承B的实现,那么不要在C中声明void Foo()

class C: public B
{
public:
    void Test();
};

【讨论】:

  • 另外,你应该在 void Test() 上有虚拟标签,并且(作为个人喜好)我总是在覆盖虚拟函数时使用 override 关键字。这些都不是让您的代码运行所必需的,但它们确实使您正在做的事情更加明显,并强制进行额外的编译器检查。
【解决方案2】:

你已经使 A::Test() 成为纯虚拟的,所以子类必须实现它。

这就是A::Test()=0 语法的含义。

如果删除=0,并在父类中提供实现,则无需在子类中实现。

【讨论】:

    【解决方案3】:

    您只需要抽象基类中的纯虚函数即可进行动态绑定。

    编辑:我很确定您需要实现所有功能,即使它们是空的。这就是为什么它不会为你编译。

    class A
    {
        public:  
        virtual void Foo()=0;
        virtual void Test()=0;
    };
    
    class B: public A
    {
        public: 
        void Foo();
        void Test();
    };
    
    void B::Foo()
    {
    
    }
    void B::Test()
    {
    
    }
    
    
    class C: public B
    {
        public:
        void Foo();
        void Test();
    };
    
    
    void C::Foo()
    {
    
    }
    void C::Test()
    {
    }
    

    【讨论】:

    • 我在自己的linux上测试过,必须实现所有功能才能编译成功。
    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2020-02-23
    • 1970-01-01
    • 2012-12-10
    • 2018-06-12
    相关资源
    最近更新 更多