标签:单继承、多继承、继承、c++、面试题、虚函数、virtual
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。
本文出自 “无心的执着” 博客,谢绝转载!
标签:单继承、多继承、继承、c++、面试题、虚函数、virtual
原文地址:http://10740590.blog.51cto.com/10730590/1750262