写一个最简单的例子,来实现"派生和继承"
父类 子类
创建一个父类:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Father{
public:
Father(string name,int age) {
this->name = name;
this->age = age;
cout << __FUNCTION__ << endl;//打印自己本身的函数;
}
~Father(){}
string getName() { return name; }
int getAge() { return age; }
string description() {
stringstream ret;
ret << "name:" << name << ",age:" << age;
return ret.str();
}
private:
string name;
int age;
};
创建一个子类:
#include "Father.h"//包含父类的头文件,当包含了这个父类的头文件后,里面所有的头文件都会包含进来;
//注意:构造函数和析构函数是不可以继承的;
//子承父类:共有继承方式:
class Son : public Father {
public:
//创建子类Son对象时,会调用构造函数!
//会先调用父类的构造函数,用来初始化从父类继承的数据
//再调用自己的构造函数,用来初始化自己定义的数据
Son(string name, int age, string game):Father(name,age)//父类初始化;
{
//没有体现父类的构造函数,那么会自动调用父类的默认构造函数!
this->game = game;
cout << __FUNCTION__ << endl;
}
~Son(){}
string getGame() { return game; }
string description() {
stringstream ret;
//子类的成员函数中,不能直接访问从父类继承的private(私有)成员;
ret << "name:" << getName() << ",age:" << getAge() << ",game:" << game;
return ret.str();
}
private:
string game;
};
测试函数:
#include "Father.h"
#include "Son.h"
int main(void) {
Father K1("王健林", 60);//父类对象;
Son T1("王思聪", 30, "LOL");//子类对象;
cout << K1.description() << endl;
//子类对象调用方法时,先在自己定义的方法中寻找,如果有就调用自己定义的方法,
//如果找不到,就到父类的方法中找,如果有就调用父类的这个同名方法
//如果还是找不到,就会发生错误!
cout << T1.description() << endl;
//总结:
//子类,一般会添加自己的数据成员和成员函数,或者重新定义从父类继承的方法!
//子类对象就会调用自己重新定义的方法,不会调用父类的同名方法!
system("pause");
return 0;
}
运行结果:
先是调用了父类的构造函数,
在子类中同样也是先调用父类的构造函数,然后再调用子类的构造函数;