C++重要知识点小结--1 :http://www.cnblogs.com/heyonggang/p/3246631.html

1.C++允许程序员声明一个不能有实例对象的类,这样的类惟一的用途是被继承。这种类成为抽象类。

一个抽象类至少具有一个纯虚函数。所谓纯虚函数是指被标明为不具体实现的虚成员函数。

如:

virtual void WithDrawal(float amount) = 0;  //纯虚函数

在WithDrawal()的声明之后的“=0”表明程序员将不定义该函数。该声明是为派生类而保留的位置

一个抽象类不能有实例对象,即不能由该类抽象来制造一个对象。

纯虚函数是在基类中为子类保留的一个位置,以便子类用自己的实在函数定义来重载之。如果在基类中没有保留位置,则就没有重载。

纯虚函数是一个没有定义函数语句的基类虚函数,纯虚函数的值是0.派生类必须为每一个基类纯虚函数提供一个相应的函数定义。

 

 

2.派生类可以继承基类的所有公有保护的数据成员和成员函数。

保护的访问权限对于派生类来说是公有的,而对于其它的对象来说是私有的。即使是派生类也不能访问基类的私有的数据成员和成员函数

在派生类中允许重载基类的成员函数。如果基类中的函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向的对象类型来调用派生类的函数。

 

3.笔试,面试中常考的C++虚拟继承的知识点

第一种情况:         第二种情况:          第三种情况            第四种情况:
class a           class a              class a              class a
{              {                {                 {
    virtual void func();      virtual void func();       virtual void func();        virtual void func();
};              };                  char x;              char x;
class b:public virtual a   class b :public a           };                };
{              {                class b:public virtual a      class b:public a
    virtual void foo();        virtual void foo();     {                 {
};              };                  virtual void foo();        virtual void foo();
                               };                };

如果对这四种情况分别求sizeof(a),  sizeof(b)。结果是什么样的呢?下面是输出结果:(在vc6.0中运行)
第一种:4,12
第二种:4,4
第三种:8,16
第四种:8,8

可参考:http://blog.csdn.net/wangqiulin123456/article/details/8059536

想想这是为什么呢?

因为每个存在虚函数的类都要有一个4字节的指针指向自己的虚函数表,所以每种情况的类a所占的字节数应该是没有什么问题 的,那么类b的字节数怎么算呢?看“第一种”和“第三种”情况采用的是虚继承,那么这时候就要有这样的一个指针vptr_b_a,这个指针叫虚类指针,也 是四个字节;还要包括类a的字节数,所以类b的字节数就求出来了。而“第二种”和“第四种”情况则不包括vptr_b_a这个指针,这回应该木有问题了 吧。

1 class a
2 {
3     virtual void func();
4 };
5 
6 class b:public a
7 {
8     void foo();
9 };

此时:sizeof(a) = 4 , sizeof(b) = 4

1 class a
2 {
3    void func();
4 };
5 
6 class b:public a
7 {
8     virtual void foo();
9 };

此时:sizeof(a) = 1 , sizeof(b) = 4

1 class a
2 {
3    void func();
4 };
5 
6 class b:public a
7 {
8     void foo();
9 };

此时:sizeof(a) = 1 , sizeof(b) = 1

如下例:

 1 class A
 2 {
 3 };
 4 class A2
 5 {
 6 };
 7 class B : public A
 8 {
 9 };
10 class C : public virtual B
11 {
12 };
13 class D : public A , public A2
14 {
15 };
View Code

相关文章: