先回答大家的问题:派生类的默认继承方式有两种。用class定义派生类,默认的继承方式是private,用struct定义派生类,默认的继承方式为public。
推荐教程:c++视频教程
继承性是面向对象程序设计的第二大特性,它允许在既有类的基础上创建新类,新类可以继承既有类的数据成员和成员函数,可以添加自己特有的数据成员和成员函数,还可以对既有类中的成员函数重新定义。利用类的继承和派生实现了更高层次的代码可重用性,符合现代软件开发的思想。
c++语言同时支持单一继承和多重继承。单一继承是指派生类只从一个基类继承而来;相应的,多重继承指派生类同时从两个或更多的基类继承而来。java只支持单一继承。
一. 派生类
派生类的定义格式如下:
class <派生类名>:[继承方式]<基类名1> [,[继承方式]<基类名2>,...,[继承方式]<基类名n>] { <派生类新增的数据成员和成员函数定义> };
说明:
(1)定义派生类关键字可以是class或者是struct,两者区别是:用class定义派生类,默认的继承方式是private,用struct定义派生类,默认的继承方式为public。新增加的成员默认属性也是class对应private属性,struct对应public属性。
(2)基类不能被派生类继承的两类函数是构造函数和析构函数。
二. 3种继承方式下基类成员在派生类中的访问属性
继承描述符 父public成员 父protected成员 父private成员
public 子public成员 子protected成员 -
protected 子protected成员 子protected成员 -
private 子private成员 子private成员 -
用下面的代码简单理解一下:
#include "stdafx.h"#include<iostream> using namespace std; class base { private: int pridata; 9 protected: int prodata; public: int pubdata; };class d1:private base//私有继承 { void f1() { //pridata=1;//基类private成员在派生类中不可直接访问 prodata=2;//基类的protected成员在派生类中为private访问属性 pubdata=3;//基类的public成员在派生类中为private访问属性 } }; class d2:protected base//保护继承 { void f2() { //pridata=1;//基类private成员在派生类中不可直接访问 prodata=2;//基类的protected成员在派生类中为protected访问属性 pubdata=3;//基类的public成员在派生类中为protected访问属性 } }; class d3:public base//公有继承 { void f3() { //pridata=1;//基类private成员在派生类中不可直接访问 prodata=2;//基类的protected成员在派生类中为protected访问属性 pubdata=3;//基类的public成员在派生类中为public访问属性 } }; int main() { base obj; //obj.pridata=1;//对象不可访问base类中private成员 //obj.prodata=2;//对象不可访问base类中protected成员 obj.pubdata=3; d1 objd1; //objd1.pubdata=3;//private属性,不可访问 d2 objd2; //objd2.pubdata=3;//protected属性,不可访问 d3 objd3; objd3.pubdata=3;//public属性,可以访问 return 0;}
基类的private成员函数虽然在派生类的成员函数中不可直接访问,但派生类的成员函数可以通过调用基类被继承的函数来间接访问这些成员。如果基类的函数被继承后在派生类中仍为public成员,则可以通过派生类对象直接调用。
先来看一下类成员的访问属性及作用:
访问属性 作用
private 只允许该类的成员函数及友元函数访问,不能被其他函数访问
protected 既允许该类的成员函数及友元函数访问,也允许其派生类的成员函数访问
public 既允许该类的成员函数访问,也允许类外部的其他函数访问
好了,继续通过代码来理解:
#include "stdafx.h" #include<iostream> using namespace std; class base { private: int pridata; protected: int prodata; public: int pubdata; //在类的定义中不能对数据成员进行初始化 void setdata()//为基类中的数据成员赋值 { pridata=100; prodata=200; pubdata=300; } void print() { cout<<"pridata="<<pridata<<endl; cout<<"prodata="<<prodata<<endl; cout<<"pubdata="<<pubdata<<endl; } }; class derived:public base { public: void changedata() { setdata(); prodata=12;//在派生类的成员函数类可以访问基类的非私有成员 } }; int main() { base b; b.setdata(); b.print(); derived d1; d1.changedata(); d1.pubdata=13; d1.print(); return 0; }
程序运行结果如下:
以上就是派生类默认的继承方式是什么的详细内容。