public、protected、private不仅是类中的访问限制符,在c++中“继承”中,它们还表示继承关系,public表示公有继承,protected表示受保护的,private表示私有的,如下图:
B类继承A类,我们称A类为基类(父类),称B类为派生类(子类),子类包括父类的成员变量和成员函数,三种继承关系基类成员在派生类中的访问关系变如下。
下面是以B继承A的详细代码:
//单继承 A->B
class A
{
public:
void fun1()
{
cout << "A::fun1" << endl;
}
private:
int a;
};
class B : public A
{
public:
void fun2()
{
cout << "B::fun2" << endl;
}
private:
int b;
};
程序运行后,调用内存会发现子类B中有父类中的成员变量与成员函数,设b是类B的对象,用sizeof(b)求得的大小为8。
说到“继承”就不免提到virtual这个关键字,对于成员函数的重写(覆盖),我们又应当怎样做呢?重写的概念是:当两个同名的函数(参数也相同)在不同的作用域中,这里指两个函数分别在父类和子类中,同时父类中的函数必须要求是虚函数,即就是在函数前面加上virtual的关键字,这就构成了虚函数的覆盖。
下面是虚函数覆盖:
class A
{
public:
virtual void fun1()
{
cout << "A::fun1" << endl;
}
private:
int a;
};
class B : public A
{
public:
void fun1()
{
cout << "B::fun1" << endl;
}
private:
int b;
};
既然有单继承就有多继承,多继承顾名思义就是子类有两个及两个以上的父类,即就是如下图所示:
下面是具体的程序示例:
class A
{
public:
virtual void fun1()
{
cout << "A::fun1" << endl;
}
private:
int a;
};
class B
{
public:
virtual void fun1()
{
cout << "B::fun1" << endl;
}
void fun2()
{
cout << "B::fun2" << endl;
}
private:
int b;
};
class C : public A, public B
{
public:
void fun2()
{
cout << "C::fun2" << endl;
}
void fun3()
{
cout << "C::fun3" << endl;
}
private:
int c;
};
根据上面的多重继承示例,计算类C的对象从c1的大小为20,因为类A中存在虚函数,编译会自动产生一个虚函数指针,占4个字节的大小,B类也是同样,所以c1的大小为20个字节。下面是监视c1的结果:
如若将类A和B中的virtual去掉,则sizeof(c1)的大小为12,因为不会产生虚函数指针,其中类C的fun2不会覆盖类B的fun2。
转载于:https://blog.51cto.com/10740590/1750262