一、继承访问权限测试
设计类A具有public, protected, private等不同属性的成员函数或变量;
类B通过public, protected, private等不同方式继承A,在类B的成员函数中测试访问A的成员函数或变量;
在类B中添加public, protected, private等不同属性的成员函数或变量,在外部测试访问B的各个成员函数或变量;
B以private方式继承A,尝试把A中的部分public成员提升为public。
二、友元类继承测试
设计类A含有私有变量a,在类A中友元给类C;
设计类B继承A,添加私有变量b;在类C中测试访问类B的成员变量a, b;
设计类D继承C,在D的成员函数中测试访问类A的成员变量a,类B的成员变量a, b。
三、多态性综合运用
一般多态性函数:输入输出参数完全一样,在父类中添加virtual;
特殊多态性函数:输入或输出参数在子类中是父类的指针或基类的引用,在子类中对于的是子类的指针或子类的引用;
析构函数的多态性;
多继承,注意什么情况需要虚继承;
二、实验过程
设计类A具有public, protected, private等不同属性的成员函数或变量;
class A
{
private:
int pri_a;
protected:
int pro_a;
public:
A();
int pub_a;
friend class C;
virtual void name() {
cout << "i am A" << endl;
}
};
类B通过public, protected, private等不同方式继承A,在类B的成员函数中测试访问A的成员函数或变量;
//公共继承
class B1:public A{
public:
void fun1(){
pub_a;//可以访问public 权限为public
pro_a;//可以访问protected 权限为protected
//pri_a;// 不能访问父类的private
}
};
//保护继承
class B2:protected A{
public:
void fun2(){
pub_a;//可以访问public 权限为protected
pro_a;//可以访问protected 权限为protected
//pri_a;//不能访问父类的private
}
};
//私有继承
class B3:private A{
public:
void fun3(){
pub_a;//可以访问public 权限为private
pro_a;//可以访问protected 权限为private
//pri_a;//不能访问父类的private
}
};
在类B中添加public, protected, private等不同属性的成员函数或变量,在外部测试访问B的各个成员函数或变量;
B a; cout << a.pub_a << endl;//在外部访问B的各个成员;pub_a可以访问到 //cout << a.pri_a<
B以private方式继承A,尝试把A中的部分public成员提升为public。
class B3 :private A
{
public:
using A::pub_a;//在B3中提升A的public成员为public
void call() { //测试A中成员
//pri_a = 1; error
pro_a = 2;
pub_a = 3;
}
};
友元类继承测试
#includeusing namespace std; class A { private: int a=100; friend class C; }; class B :public A { private: int b=10; }; class C { public: void test() { B b1; b1.a; //b1.b不可访问 } }; class D :public C { public: void test() { A a1; //a1.a;不可访问 B b1; //b1.a;不可访问 //b1.b;不可访问 } };
一般多态性函数:输入输出参数完全一样,在父类中添加virtual
class Animal {
public:
int m_Age=0;
public:
virtual void speak() {
cout << "动物在说话" << endl;
}
};
class Sheep :public Animal{
public:
void speak() {
cout << "羊在说话" << endl;
}
};
class Camel :public Animal{
public:
void speak() {
cout << "骆驼在说话" << endl;
}
};
三、总结
1、虚函数
- 用virtual关键字说明的函数
- 虚函数是实现运行时多态性基础
- C++中的虚函数是动态绑定的函数
- 虚函数必须是非静态的成员函数,虚函数经过派生之后,就可以实现运行过程中的多态。
2、多继承,注意什么情况需要虚继承;
多继承
派生类有多个基类继承而来叫做多继承,其构造时按照基类在派生类中的声明顺序依次进行,由于派生类有多个基类派生而来,所以可能出现命名冲突,出现冲突时使用::指明到底使用的是哪个类的成员。c由AB派生而来,其内存模型如上图所示。
虚继承(菱形继承)
类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这个时候类 A 中的成员变量和成员函数继承到类 D 中变成了两份,一份来自 A–>B–>D 这条路径,另一份来自 A–>C–>D 这条路径。当需要访问A的成员变量时,就会产二义性。
虚继承时构造函数的执行顺序与普通继承时不同:在最终派生类的构造函数调用列表中,不管各个构造函数出现的顺序如何,编译器总是先调用虚基类的构造函数,再按照出现的顺序调用其他的构造函数;而对于普通继承,就是按照构造函数出现的顺序依次调用的。



