1,多重继承
我接触的语言中,能支持多重继承的也就C++了,下面看看他到底怎么个多继承法。
入正题,看代码:
#include <iostream>
class Peolpe
{
public:
int age;
void setAge(int aAge)
{
age = aAge;
};
void printf()
{
std::cout<<"输出age:"<<age;
}
};
class Man
{
int age1;
public:
void setAge(int aAge)
{
age1 = aAge;
}
};
class Woman:public Peolpe,public Man
{
public:
};
int main(int argc, const char * argv[])
{
Woman w;
w.Man::setAge(55);
w.printf();
return 0;
}
从上面看到,我定义了三个类,其中前两个类People,Man是基类,我把Woman当做子类,Woman继承于People,Man.
多重继承需要注意的点:
(1),多重继承的父类用“,”隔开
(2),当两个父类具有相同的成员函数,例如上例子中得setAge,则在调用该成员函数的时候需要标明类名,例如:
w.Man::setAge(55);
当然了,也可以不那么做这就需要用到关键字Virtul,个人不太喜欢这个关键字,如果需要自己研究的可以百度下看看,用了这个关键字修饰继承的类之后,再调用同名成员函
数的时候就不需要再去标明来自哪一个类了。
(3),这个需要注意:默认情况下,子类继承父类的默认构造函数,即使不带任何参数的构造函数,子类也继承默认的析构函数。
2,虚函数
上代码:
#include <iostream>
class Father
{
public:
virtual void jump()
{
std::cout<<"父亲跳十万米\n";
};
void run()
{
std::cout<<"父亲跑步\n";
};
};
class Son:public Father
{
public:
void jump()
{
std::cout<<"儿子跳十万米\n";
};
void run()
{
std::cout<<"儿子跑步\n";
};
};
int main(int argc, const char * argv[])
{
Father * father = new Son;
father->jump();
father->run();
return 0;
}
输出:
儿子跳十万米
父亲跑步
通过输出结果,我们可能会感到诧异,然后就该去代码中看两个方法有什么不同。
然后会发现,不同点就是在于关键字:virtual
用virtual修饰的函数,我们称之为虚函数。用virtual修饰表示该函数有多种形态即该函数可能被多个对象所拥有,并且功能都不一样。
系统在执行到有virtual修饰的成员函数的时候,会判断是哪一个函数调用了他,然后去调用该函数的同名函数。