可以,但是你要小心,因为在构造函数里虚函数的机制并没有启用。 #include<string> #include<iostream> using namespace std; class B { public: B(const string& ss) { cout << "B constructor\n"; f(ss); } virtual void f(const string&) { cout << "B::f\n";} }; class D : public B { public: D(const string & ss) :B(ss) { cout << "D constructor\n";} void f(const string& ss) { cout << "D::f\n"; s = ss; } private: string s; }; int main() { D d("Hello"); }the program compiles and produce B constructor B::f D constructor注意:输出的是B::f,而不是D::f,因为在构建D的时候会先构建B,在B尚未完成构造的时候D是不存在的,因此如果在B中调用了还没有构建的D的成员函数(可能会修改D的变量),会导致错误。 在析构函数中同样的道理,只有本类的函数会被调用,以避免调用已经被释放的派生类的成员函数。

评论