【问题标题】:Implementing a contract in Borland C++ Builder在 Borland C++ Builder 中实现合约
【发布时间】:2012-09-19 17:39:23
【问题描述】:

我正在尝试在 Borland C++ Builder 中实现一个契约类,但得到一个我不理解的编译错误。代码如下:

class baseClass2 {
  public:
    virtual void test () = 0;
};

class derivedClass: public baseClass2 {
  derivedClass () {test ();};
};

void baseClass2::test () {

};

它编译,但我相信

void baseClass2::test ()
应该在派生类中。如果我把它放在这里,我会得到

[C++ 错误] multiple_inheritance.cpp(33): E2316 'derivedClass::test()' 不是“派生类”的成员

为什么我会得到这个?谢谢!

【问题讨论】:

  • 好的,所以我找到了答案,我还需要将void test()作为派生类中的成员函数。

标签: c++ c++builder contract


【解决方案1】:

void baseClass2::test()

这是不正确的,因为您已经在 baseClass2 中将 test() 声明为虚函数。

应该在派生类中

在你这样做之前,你应该在derivedClass定义中声明它如下:

class derivedClass: public baseClass2 {
public:
    derivedClass () {test ();};
    virtual void test();
};

void derivedClass:test() {

}

然后你可以在你的派生类构造函数中调用test()

【讨论】:

    【解决方案2】:

    test() 的基类实现是纯虚拟的。在你的基类中提供一个实现是合法的,但你仍然必须在你的派生类中提供另一个实现(假设你希望 derivedClass 是一个具体的类)。

    class baseClass2 {
    public:
        virtual void test () = 0;
    };
    
    class derivedClass: public baseClass2  {
    public:
        derivedClass() { test(); }
        void test();
    };
    
    void baseClass2::test () {
    }
    
    void derivedClass::test () {
    } 
    

    【讨论】:

      【解决方案3】:

      这是相当微妙的。如果你的派生 constructor 应该调用一个在你的祖先类中声明为 virtual 的函数(无论是直接的,还是通过另一个成员函数(因此很难发现)),那么你将调用在基类中实现。这会发生即使你已经覆盖了虚函数。

      这意味着在您的情况下derivedClass::derivedClass() 将因此调用纯虚拟baseClass2::test()。哎呀!

      是的,这就是 C++ 的工作原理。 当您在构造函数中时,派生的 vtable 指针指向基类 vtable。它只会在您离开构造函数时更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-25
        • 2014-12-10
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多