C++继承问题

来源:互联网 发布:淘宝代运营 猪八戒网 编辑:程序博客网 时间:2024/05/29 19:46

C++的三大特性:封装, 继承, 多态 

如何实现继承是C++中基本的核心的部分。

我在此就自己的认识理一理继承问题;

情形1:

单继承: 单继承是最简单的继承方式, 其中继承权限分为 public ;protectsd和 private三种。

class A{

public:

int  a;

protected:

int  b;

private:

  int  c;

};

class B: public A{

};

class C :private A{

};

class D: protected A{  };

很显然B是满足is-a性质的公有继承。 

访问权限如下:

 首先, 类B公有继承自A, 类B可以访问类A中的公有成员和保护成员。类B的对象只能访问类A中的公有成员。

类C私有继承自A, 类C可以访问类A中的公有成员和保护成员, 类C对象无法访问类A中的成员;

类D保护继承自A, 类D可以访问类A中的公有成员和保护成员, 类D对象无法访问类A中的成员。

 如果再有类继承自C或者D则访问关系可以以此类推。


多重继承:

多重继承的内部分析: 

1. class A{int a;};

 class B{int b;}

class C: public A, public B{}

C c;

A *p1 = c 与B *p2 = c; 其中p2在指向c的时候在内部进行了转化 p2 = (B*)(&c + sizeof(A));


虚拟继承:

虚拟继承的内部分析:

 虚拟继承是多重继承的特有概念, 是为了解决多重继承中的问题而提出的。                            

产生一个虚指针指向基类。


首先分析下公有继承,保护型继承和私有继承:

公有继承很好理解, 就是要塑模出is-a的特性,就是要求用此类的用户不会误解你的意思。

如 class bird{

public:

void fly();

};

class qi’e: public bird

{};  类的继承表达了企鹅可以飞,但是现实中确不是如此的。这就是乱用了公有继承。


私有继承: 

私有继承  的含义是根据某物塑模出东西来,一般是不要派生类访问基类的保护型成分, 或者为了重新定义虚函数,而不让派生类中public出基类的虚函数,所采用的设计方法;

多重继承和虚继承之间的关系:

再讲一下虚拟成员函数:.

多重继承中虚拟成员函数是很难实现的, 复杂度很高。

主要在于第二个基类的实现, 问题1 虚拟的析构函数,问题二: 基类2中的其他非虚函数, 问题三: 虚拟函数;

需要在执行期加入位置偏移的代码。

并且需要分开来访问:


#include "stdafx.h"
#include <iostream>
using namespace std;


class Base1 {
public:
virtual void f(){
cout<<1;
}
virtual void g(){
cout<<4;
};
};


class Base2{
public:
virtual void f(){
cout<<2;
}
virtual void h(){};
};


class C :public Base1, public Base2{
public:
virtual void f(){
cout<<3;
}
};


void main()
{
Base1 a;
Base2 b;
C c;
Base1 *p1 = &c;
p1->g();
Base2 *p2 = &c;
p2->h();

    p2->g();//错误 无法调用Base1中的函数
}



0 0