我正在查看有关使用基类指针到派生类对象的好处的几个SO帖子(下面列出)。但在大多数情况下,虚函数是使用基类指针的最终目的。我在其中一些帖子中添加了评论,但我想由于这些帖子已经过时,因此未收到回复。 现在我的问题是,如果我们不使用虚函数概念,在其他情况下是否有使用基类指针的目的?
在下面的代码中,
由于缺少虚函数,pEmp-> computeTotalSalary
调用基类函数。这是预期的行为。
#include <iostream>
using namespace std;
class Employee
{
public:
void computeTotalSalary ()
{
cout<<"Computing Employee Salary in Base Class:"<<endl;
}
};
class TeachingStaff : public Employee
{
public:
// Override the function
void computeTotalSalary ()
{
cout<<"Computing Teacher's Salary in Sub class: "<<endl;
}
};
int main()
{
TeachingStaff *pTeacher = new TeachingStaff() ;
pTeacher->computeTotalSalary();
Employee *pEmp;
pEmp = pTeacher;
pEmp->computeTotalSalary();
pTeacher->Employee::computeTotalSalary();
}
答案 0 :(得分:3)
使用基类指针或引用允许您编写一般接受所有派生类的函数,以便可以在它们上调用常见的非虚函数。否则,您必须为不同的派生类多次编写相同的函数,或使用模板。
#include <iostream>
class base_t {
public:
void non_virtual() const { std::cout << "Hello, World!\n"; }
};
class derived_1_t : public base_t { };
class derived_2_t : public base_t { };
void do_something(const base_t& obj) {
obj.non_virtual();
}
int main() {
derived_1_t var1;
derived_2_t var2;
do_something(var1);
do_something(var2);
}
答案 1 :(得分:1)
虽然你可以故意隐藏基类中的函数,但这通常是一个无意的错误(或糟糕的设计)。引入了C ++ 11 override
关键字来帮助防止出现这种错误。
除了虚函数和多态之外,还有其他继承用例。例如:(1)可以将一堆对象放在异构容器中,例如std::vector<Employee*>
,它不需要访问派生类数据,尽管这可能是没有多态性的怀疑,(2) )继承行为或POD数据成员(也是有问题的实践),或(3)继承基于策略的设计(参见Alexandrescu&#39; s 现代C ++设计)。
通常,您还需要一个用于继承根的析构函数。 Herb Sutter says,&#34;基类析构函数应该是public和virtual,或者是protected和nonvirtual。&#34;
您也可以考虑不以这种方式使用继承。见&#34; Better Code: Runtime Polymorphism&#34;肖恩父母,这可能会让你大吃一惊。