0

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

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

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

void baseClass2::test () {

};

蚂蚁它编译,但我相信

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

[C++ 错误] multiple_inheritance.cpp(33): E2316 'derivedClass::test()' is not a member of 'derivedClass'

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

4

3 回答 3

0

the base class implementation of test() is pure-virtual. It's legal to provide an implementation in your base class, but you must still provide another one in your derived class as well (assuming that you want derivedClass to be a concrete class).

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

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

void baseClass2::test () {
}

void derivedClass::test () {
} 
于 2012-09-19T17:48:20.027 回答
0

无效 baseClass2::test ()

这是不正确的,因为您已经test()baseClass2.

应该在派生类中

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

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

void derivedClass:test() {

}

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

于 2012-09-19T17:44:32.443 回答
0

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

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

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

于 2012-09-20T08:44:57.890 回答