c++多态,子类和父类方法的调用
2017-07-28 15:05
246 查看
#include <iostream>
using namespace std;
class A{
public:
void run(){
cout << "A : void run()" << endl;
}
virtual void run0(){
cout << "A : void run0()" << endl;
}
A(){
cout << "A()" << endl;
}
virtual ~A(){
cout << "~A()" << endl;
}
A(const A &a){
cout<< "A(const A &a)" << endl;
}
};
class B:public A{
public:
void run(){
cout << "B:void run()" << endl;
}
void run0(){
cout << "B: void run0()" << endl;
}
B(){
cout << "B()" << endl;
}
~B(){
cout << " ~B()" << endl;
}
B(const B &b){
cout<< "B(const B &b)" << endl;
}
};
void fun(A &a){
a.run();
}
void fun0(A a){
a.run();
}
void fun1(A *a){
a->run();
}
void rfun(A &a){
a.run0();
}
void rfun0(A a){
a.run0();
}
void rfun1(A *a){
a->run0();
}
int main()
{
A a;
B b;
a.run(); //父类方法
b.run(); // 子类方法
fun(a); //父类方法
fun(b); //父类方法
fun0(a); // 值传递要先拷贝一份
fun0(b); //父类方法 // 值传递要先拷贝一份
fun1(&a);
fun1(&b); //父类方法
//发现问题:通过函数调用不了B的方法
//解决问题:需要将父类的方法加上virtual修饰
cout << "************" << endl;
a.run0(); //父类方法
b.run0(); // 子类方法
rfun(a);
rfun(b); //子类方法
rfun0(a); // 值传递要先拷贝一份
rfun0(b); //父类方法 // 值传递要先拷贝一份
rfun1(&a);
rfun1(&b); //子类方法
//发现问题:通过函数调用传参是对象的值的话,无法调用子类的方法
//解决问题:尽量不要用值传递的方式
A *p = new B;
delete p; //此时,调用不了B的析构器,需要将A的析构器加virtual修饰
cout << "Hello world!" << endl;
return 0;
}
using namespace std;
class A{
public:
void run(){
cout << "A : void run()" << endl;
}
virtual void run0(){
cout << "A : void run0()" << endl;
}
A(){
cout << "A()" << endl;
}
virtual ~A(){
cout << "~A()" << endl;
}
A(const A &a){
cout<< "A(const A &a)" << endl;
}
};
class B:public A{
public:
void run(){
cout << "B:void run()" << endl;
}
void run0(){
cout << "B: void run0()" << endl;
}
B(){
cout << "B()" << endl;
}
~B(){
cout << " ~B()" << endl;
}
B(const B &b){
cout<< "B(const B &b)" << endl;
}
};
void fun(A &a){
a.run();
}
void fun0(A a){
a.run();
}
void fun1(A *a){
a->run();
}
void rfun(A &a){
a.run0();
}
void rfun0(A a){
a.run0();
}
void rfun1(A *a){
a->run0();
}
int main()
{
A a;
B b;
a.run(); //父类方法
b.run(); // 子类方法
fun(a); //父类方法
fun(b); //父类方法
fun0(a); // 值传递要先拷贝一份
fun0(b); //父类方法 // 值传递要先拷贝一份
fun1(&a);
fun1(&b); //父类方法
//发现问题:通过函数调用不了B的方法
//解决问题:需要将父类的方法加上virtual修饰
cout << "************" << endl;
a.run0(); //父类方法
b.run0(); // 子类方法
rfun(a);
rfun(b); //子类方法
rfun0(a); // 值传递要先拷贝一份
rfun0(b); //父类方法 // 值传递要先拷贝一份
rfun1(&a);
rfun1(&b); //子类方法
//发现问题:通过函数调用传参是对象的值的话,无法调用子类的方法
//解决问题:尽量不要用值传递的方式
A *p = new B;
delete p; //此时,调用不了B的析构器,需要将A的析构器加virtual修饰
cout << "Hello world!" << endl;
return 0;
}
相关文章推荐
- JavaSE8基础 多态扩展性 父类引用作为函数参数,调用所装子类对象的重写方法
- 关于C++中子类调用父类方法的一个问题
- C++ 子类B重载父类A的方法funA后,在父类A中调用funA会调用子类B还是父类A的funA方法?
- 子类继承父类,重写父类方法,运用多态时调用重写的方法时调用子类的还是调用父类的?
- c++ 子类调用父类构造方法 调用父类方法 类声明与实现分离
- C++和JAVA中一些区别,包括指向子类的引用会调用谁的方法,子类构造函数自动调用父类构造函数时,父构造会调用的谁方法
- 关于C++中子类调用父类方法的一个问题
- 子类调用父类方法:c++和java的不同
- c++与java中子类中调用父类成员的方法
- c++ 父类和子类的方法调用
- C语言使用技巧3:C++中子类调用父类重载函数的方法
- C++关于子类调用父类的构造方法的问题
- c++和java中关于如何调用父类方法和子类方法的辨析
- JavaSE8基础 多态 子类重写了父类的普通方法 父类引用调用子类中重写的方法
- Java多态 实例子类自动调用父类为空的构造方法 成员变量不支持Override 可写,没多态效果
- Python基础-接口与归一化设计、抽象类、继承顺序、子类调用父类,多态与多态性
- c++ 子类调用父类有参构造函数
- 子类实现父类的抽象方法,父类调用抽象方法
- 关于Java中子类调用父类方法