构造函数是实现继承的关键,子类对象在构造时,首先调用父类的构造函数,在调用自己的构造函数。
#include <iostream>
using namespace std;
template <typename T>
class A
{
public:
friend T;
private:
A(){}
~A(){}
};
class B:virtual public A <B>
{
public:
B(){}
~B(){}
};
//class C:virtual public B
//{
// public:
// C(){}
// ~C(){}
//};
int main()
{
B b;
// C c;
定义一个友元类friend T,B在继承的时候,用自己去具体化A,将自己设置为A的友元类,这样就可以访问A的私有函数(构造函数),B就可以正常定义对象b,C虚继承B,但是友元关系不能继承。所以C在构造时,不能调用A的构造函数,如果打开注释部分,将报下边的错误。
template.cpp: In constructor ‘C::C()’:
template.cpp:11:3: error: ‘A<T>::A() [with T = B]’ is private
A(){}
^
template.cpp:25:6: error: within this context
C(){}
^
template.cpp:12:3: error: ‘A<T>::~A() [with T = B]’ is private
~A(){}
^
template.cpp:25:6: error: within this context
C(){}
^
template.cpp: In destructor ‘C::~C()’:
template.cpp:12:3: error: ‘A<T>::~A() [with T = B]’ is private
~A(){}
^
template.cpp:26:7: error: within this context
~C(){}
^