- 多级派生的构造函数
C++中多级继承的构造函数可以使用初始化列表来构造。子类的构造函数可以通过在初始化列表中调用父类的构造函数来完成基类的初始化工作,同时也可以在子类的初始化列表中为子类自身的成员变量赋初值。
例如下面的代码:
class Grandparent {
public:
int a;
Grandparent(int _a) : a(_a) {}
};
class Parent : public Grandparent {
public:
int b;
Parent(int _a, int _b) : Grandparent(_a), b(_b) {}
};
class Child : public Parent {
public:
int c;
Child(int _a, int _b, int _c) : Parent(_a, _b), c(_c) {}
};
int main() {
Child child(1, 2, 3);
cout << child.a << " " << child.b << " " << child.c << endl;
return 0;
}
这里我们定义了三个类Grandparent、Parent和Child,Child是多重继承自Parent和Grandparent。我们定义了一个带有三个参数的Child的构造函数,在初始化列表中调用了Parent的构造函数和Grandparent的构造函数,并对自己的成员c赋初值。在main函数中我们创建了一个Child类型的对象child,并输出了它的三个成员变量的值。
输出结果为:
1 2 3
- 多级派生的访问属性
多级派生中的访问属性遵循C++的继承规则。子类可以访问父类的公有成员,但不能访问父类的私有成员。如果父类的成员是保护的,子类可以访问,但子类的子类不能访问。
我们可以通过下面的代码来说明这个规则:
class Grandparent {
public:
int a;
protected:
int b;
private:
int c;
};
class Parent : public Grandparent {
public:
void foo() {
cout << a << endl; // 可以访问Grandparent的公有成员
cout << b << endl; // 可以访问Grandparent的保护成员
// cout << c << endl; // 错误:不能访问Grandparent的私有成员
}
};
class Child : public Parent {
public:
void bar() {
cout << a << endl; // 可以访问Grandparent的公有成员
cout << b << endl; // 可以访问Grandparent的保护成员
// cout << c << endl; // 错误:不能访问Grandparent的私有成员
}
};
int main() {
Child child;
child.foo(); // 可以访问
child.bar(); // 可以访问
// cout << child.a << endl; // 错误:不能直接访问Grandparent的成员
// cout << child.b << endl; // 错误:不能直接访问Grandparent的成员
// cout << child.c << endl; // 错误:不能直接访问Grandparent的成员
return 0;
}
这里我们定义了三个类Grandparent、Parent和Child,Child是多重继承自Parent和Grandparent。Grandparent有一个公有成员a、一个保护成员b和一个私有成员c。Parent和Child都有一个成员函数foo()和bar(),分别用来测试访问Grandparent的成员。在main函数中创建一个Child类型的对象child,并调用它的foo()和bar()函数来测试。
输出结果为:
0
0
这里我们发现,Child对象的a和b成员可以正常访问,但不能直接访问Grandparent的成员。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++编程中多级派生时的构造函数和访问属性 - Python技术站