C类中,如何实现二重继承与多态的派生机制?
- 内容介绍
- 相关推荐
本文共计1227个文字,预计阅读时间需要5分钟。
一、派生类的构造函数与析构函数派生类的构造函数定义了派生类对象的初始化过程,析构函数则负责释放对象占用的资源。以下是一个简单的派生类构造函数和析构函数的例子:
cpp// 基类class Base {public: Base(int value) : value_(value) {} ~Base() {}
private: int value_;};
// 派生类class Derived : public Base {public: Derived(int baseValue, int derivedValue) : Base(baseValue), derivedValue_(derivedValue) {} ~Derived() {}
private: int derivedValue_;};
二、派生类的构造函数定义形式派生类的构造函数定义形式如下:
cppclass Derived : public Base {public: Derived(参数列表) : 基类构造函数调用(参数列表), 派生类成员初始化列表() {}};
其中,参数列表包括基类构造函数的参数和派生类新增的成员变量初始化。
三、派生类初始化列表派生类的初始化列表包括基类构造函数调用和派生类成员变量的初始化。
cppclass Derived : public Base {public: Derived(int baseValue, int derivedValue) : Base(baseValue), derivedValue_(derivedValue) {}};
在这个例子中,`Base(baseValue)`是基类构造函数的调用,`derivedValue_(derivedValue)`是派生类成员变量`derivedValue_`的初始化。
一、派生类的构造和析构函数
1)构造函数
派生类的构造函数定义形式如下:
派生类名站(形式参数列表):基类名(基类构造函数实参列表),派生类初始化列表
例子:
class Point{int x,y;
public:Point(int a,int b):x(a),y(b){} //基类构造函数
};
class Rect:public Point {int h,w;
public :Rect(int a,int b,int c,int d):Point(a,b),h(c),w(d){} //派生类构造函数
如果基类有默认构造函数,或者参数全部都是默认参数的构造函数,那么派生类的构造函数中可以不显式初始化子对象。编译器会调用基类的构造函数进行初始化。
2)组合关系的派生类的构造函数
包括多个子对象的派生类的构造函数定义为:
派生类名(形式参数列表):基类名(基类构造函数实参列表),
子对象名1(子对象1所属类的构造函数实参列表)
...
派生类初始化列表
{
派生类初始化函数体
};
多重继承构造函数:
多重继承派生类的构造函数形式与单一继承时的构造函数形式基本相同,只是在派生类的构造函数初始化列表中调用调用多个基类构造函数。一般形式为:
派生类名(形参列表):基类名1(基类1构造函数实参列表)
基类名2(基类2构造函数实参列表)
...
子对象名1(子对象1所属类的构造函数实参列表)
...
派生类初始化列表
{
派生类初始化列表
};
二、虚基类
如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。
在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员,如
c1.A::display( )。
虚基类是在派生类定义时指定继承方式时声明的。因为一个基类可以在生成一个派生类时作为虚基类,而在生成另一个派生类时不作为虚基类。声明虚基类的一般形式为:
class 派生类名:virtual 访问权限标号 虚基类名,...{
成员列表
};
注意:
虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。因为一个基类可以在生成一个派生类时作为虚基类,而在生成另一个派生类时不作为虚基类。
本文共计1227个文字,预计阅读时间需要5分钟。
一、派生类的构造函数与析构函数派生类的构造函数定义了派生类对象的初始化过程,析构函数则负责释放对象占用的资源。以下是一个简单的派生类构造函数和析构函数的例子:
cpp// 基类class Base {public: Base(int value) : value_(value) {} ~Base() {}
private: int value_;};
// 派生类class Derived : public Base {public: Derived(int baseValue, int derivedValue) : Base(baseValue), derivedValue_(derivedValue) {} ~Derived() {}
private: int derivedValue_;};
二、派生类的构造函数定义形式派生类的构造函数定义形式如下:
cppclass Derived : public Base {public: Derived(参数列表) : 基类构造函数调用(参数列表), 派生类成员初始化列表() {}};
其中,参数列表包括基类构造函数的参数和派生类新增的成员变量初始化。
三、派生类初始化列表派生类的初始化列表包括基类构造函数调用和派生类成员变量的初始化。
cppclass Derived : public Base {public: Derived(int baseValue, int derivedValue) : Base(baseValue), derivedValue_(derivedValue) {}};
在这个例子中,`Base(baseValue)`是基类构造函数的调用,`derivedValue_(derivedValue)`是派生类成员变量`derivedValue_`的初始化。
一、派生类的构造和析构函数
1)构造函数
派生类的构造函数定义形式如下:
派生类名站(形式参数列表):基类名(基类构造函数实参列表),派生类初始化列表
例子:
class Point{int x,y;
public:Point(int a,int b):x(a),y(b){} //基类构造函数
};
class Rect:public Point {int h,w;
public :Rect(int a,int b,int c,int d):Point(a,b),h(c),w(d){} //派生类构造函数
如果基类有默认构造函数,或者参数全部都是默认参数的构造函数,那么派生类的构造函数中可以不显式初始化子对象。编译器会调用基类的构造函数进行初始化。
2)组合关系的派生类的构造函数
包括多个子对象的派生类的构造函数定义为:
派生类名(形式参数列表):基类名(基类构造函数实参列表),
子对象名1(子对象1所属类的构造函数实参列表)
...
派生类初始化列表
{
派生类初始化函数体
};
多重继承构造函数:
多重继承派生类的构造函数形式与单一继承时的构造函数形式基本相同,只是在派生类的构造函数初始化列表中调用调用多个基类构造函数。一般形式为:
派生类名(形参列表):基类名1(基类1构造函数实参列表)
基类名2(基类2构造函数实参列表)
...
子对象名1(子对象1所属类的构造函数实参列表)
...
派生类初始化列表
{
派生类初始化列表
};
二、虚基类
如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。
在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员,如
c1.A::display( )。
虚基类是在派生类定义时指定继承方式时声明的。因为一个基类可以在生成一个派生类时作为虚基类,而在生成另一个派生类时不作为虚基类。声明虚基类的一般形式为:
class 派生类名:virtual 访问权限标号 虚基类名,...{
成员列表
};
注意:
虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。因为一个基类可以在生成一个派生类时作为虚基类,而在生成另一个派生类时不作为虚基类。

