先看一段代码
#include <iostream>
using namespace std;
class Base {
public:
void Run() {
cout << "Base run" << endl;
}
};
class Derive : public Base {
public:
void Run() {
cout << "Derive run" << endl;
}
};
void CallFunc(Base *p) {
p->Run();
}
int main() {
Base *p = new Base();
Derive *d = new Derive();
CallFunc(p);
CallFunc(d);
delete p;
delete d;
return 0;
}
实际运行结果,都是调用Base的Run方法,预期是p调用Base,d调用Dervie。
原来具体执行哪个函数,由CallFunc的参数决定。
可以用下面的代码验证
#include <iostream>
using namespace std;
class Base {
public:
void Run() {
cout << "Base run" << endl;
}
virtual void Print() {}
};
class Derive : public Base {
public:
void Run() {
cout << "Derive run" << endl;
}
};
void CallFunc(Derive *p) {
p->Run();
}
int main() {
Base *p = new Base();
Derive *d = new Derive();
CallFunc(dynamic_cast<Derive*>(p));
CallFunc(d);
delete p;
delete d;
return 0;
}
那怎么可以达到我们的预期效果呢?
方法1:虚函数
#include <iostream>
using namespace std;
class Base {
public:
virtual void Run() {
cout << "Base run" << endl;
}
};
class Derive : public Base {
public:
void Run() {
cout << "Derive run" << endl;
}
};
void CallFunc(Base *p) {
p->Run();
}
int main() {
Base *p = new Base();
Derive *d = new Derive();
CallFunc(p);
CallFunc(d);
delete p;
delete d;
return 0;
}
方法2:函数模版
#include <iostream>
using namespace std;
class Base {
public:
void Run() {
cout << "Base run" << endl;
}
};
class Derive : public Base {
public:
void Run() {
cout << "Derive run" << endl;
}
};
void CallFunc(Base *p) {
p->Run();
}
template <typename T>
void CallFunc2(T *p) {
p->Run();
}
int main() {
Base *p = new Base();
Derive *d = new Derive();
CallFunc2<Base>(p);
CallFunc2<Derive>(d);
delete p;
delete d;
return 0;
}
网友评论