C++之函数重载与同名静态变量处理、菱形继承 1.静态变量:类内声明,类外初始化 2.函数重载,同一作用域下,改变形参的数量,数据类型,可以实现重载 3.基类与派生类出现同名静态变量或者静态成员函数,需要通过添加::的方式声明作用域 4.菱形继承问题。多个派生类中出现相同成员,利用虚继承解决菱形继承问题 example:
#include <iostream>
using namespace std;
class Base
{public:
Base()
{
static int a;
}
static void func()
{
cout << "Base-func" << endl;
}
static void func(int c)
{
cout << "Base-func" << endl;
}
};
int a = 100;
class Son :public Base {
public:
Son()
{
static int a;
}
static void func()
{
cout << "Son-func" << endl;
}
static void func(int c)
{
cout << "Son-func" << endl;
}
};
void test()
{
Son::func();
Son::Base::func();
Son::func(100);
Son::Base::func(100);
}
int main()
{
test();
system("pause");
return 0;
}
菱形继承: 概念: 两个派生类B,C继承与同一个基类A。又有某个类D继承于两个派生类。构成菱形继承 1.菱形继承,当派生类中含有相同的成员变量,会出现二义性。需要加作用域加以区分。 2.出现相同的成员变量,会导致该成员变量在某个类D中继承两份相同成员变量的数据。----------利用虚继承,可以解决该问题。关键字是virtual 3.虚继承的底层变化 example1:
#include <iostream>
using namespace std;
class Base
{
public:
int age;
};
class Sheep1 :public Base {
};
class Sheep2 :public Base {
};
class Sheep3 :public Sheep1,public Sheep2 {
};
void test()
{
Sheep3 s;
s.Sheep1::age = 18;
s.Sheep2::age = 20;
cout << "添加作用域可以避免二义性:" << endl;
cout << s.Sheep1::age << endl;
cout << s.Sheep2::age << endl;
}
int main()
{
test();
system("pause");
return 0;
}
2.虚继承:利用关键字virtual 借助VS2017开发人员命令提示符 Sheep3继承了两份age的数据,数据分别来自派生类Sheep1和Sheep2. 添加关键字virtual Sheep1出现vbptr:virtual base pointer ,显示偏移量为0; Sheep2出现vbptr:virtual base pointer ,显示偏移量为4; Base出现vbptr:virtual base pointer ,显示偏移量为4; 该关键字使得,只有一份数据。因此,如果对成员变量数据进行修改,只取最新的值
|