2012-08-29 48 views
3
class Base { 
public: 
    int a; 
    Base():a(0) {} 
    virtual ~Base(); 
} 
class Derived : public Base { 
public: 
    int b; 
    Derived():b(0) { 
     Base* pBase = static_cast<Base*>(this); 
     pBase->Base(); 
    } 
    ~Derived(); 
} 

是否需要调用基类构造函数或C++是否自动执行此操作?例如 C++是否要求您从任何派生类初始化基类成员?C++是否要求您从其派生类中初始化基类成员?

+1

“*请问C++要求你从任何派生类初始化基类成员*?”不,事实上它甚至不允许你。 'Base :: Base'初始化Base的成员,'Derived :: Derived'调用'Base :: Base'然后初始化'Derived'的成员。 – ildjarn

+0

试图编译这个会让你看到你不能调用那样的构造函数。 – chris

+0

@chris我远离编译器,此刻我正在努力工作。此外,它澄清了其他人以后谷歌搜索=) –

回答

9

在派生类的构造函数被调用之前,基类的构造函数将自动被调用。

可以使用初始化列表明确指定调用哪个基构造函数(如果有多个):

class Base { 
    public: 
    int a; 
    Base():a(0) {} 
    Base(int a):a(a) {} 
}; 
class Derived { 
    public: 
    int b; 
    Derived():Base(),b(0) {} 
    Derived(int a):Base(a),b(0) {} 
}; 
+0

感谢您的澄清。 =) –

+0

如果我回答了你的问题,你介意加注并接受我的答案吗?谢谢:) –

+1

很好的回答!我正在寻找派生类的成员初始值设定项的语法/顺序,并且找不到“好”的问题......幸运的是,我遇到了这个问题。 – Jess

1

自动调用基类构造函数(并在派生类构造函数之前)。所以你不需要,也不要尝试手动调用基础构造函数。