C++抽象类的问题(我可以用Java做,但不能用C++做!)

use*_*689 5 c++ subclass abstract pure-virtual

首先,我搜索了这个问题,发现了很多类似的问题,但我找不到解决问题的答案.如果那只是我愚蠢的话,我很抱歉.

我想要做的是使抽象类的构造函数调用纯虚函数.在Java中,这是有效的,因为子类提供了被调用的抽象方法的实现.但是,在C++中,我收到此链接器错误:

test.o:test.cpp:(.text$_ZN15MyAbstractClassC2Ev[MyAbstractClass::MyAbstractClass
()]+0x16): undefined reference to `MyAbstractClass::initialize()'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

#include <iostream>

class MyAbstractClass {
protected:
    virtual void initialize() = 0;

public:
    MyAbstractClass() {
        initialize();
    }
};

class MyClass : public MyAbstractClass {
private:
    void initialize() {
        std::cout << "yey!" << std::endl;
    }
};

int main() {
    MyClass *my = new MyClass();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

作为对我要做的事情的进一步解释,这里是Java中的代码,它实现了我的目标:

public abstract class MyAbstractClass {

    public MyAbstractClass() {
        initialize();
    }

    protected abstract void initialize();
}

public class MyClass extends MyAbstractClass {

    protected void initialize() {
        System.out.println("Yey!");
    }

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码打印出"Yey!".任何帮助非常感谢!

Lig*_*ica 4

MyAbstractClass() {
    initialize();
}
Run Code Online (Sandbox Code Playgroud)

这不会对 执行虚拟分派MyClass::initialize(),因为在对象构造的这个阶段,其MyClass各部分尚未创建。因此,您确实在调用MyAbstractClass::initialize(),因此必须对其进行定义。(是的,可以定义纯虚拟成员函数。)

尽量避免从构造函数中调用虚拟成员函数,因为这种事情会发生并让你陷入困境。这样做很少有意义。

另外,尽量避免使用initialize()函数;你已经有了可以使用的构造函数。


更新

实际上,尽管您可以将上述内容视为任何其他虚拟成员函数,但从构造函数调用纯虚拟成员函数会产生未定义的行为。所以甚至不要尝试!