如果未使用虚函数,则使用基类指针到派生类的任何目的

时间:2017-09-27 16:22:02

标签: c++ inheritance

我正在查看有关使用基类指针到派生类对象的好处的几个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();
}

链接: 1. Why use base class pointers for derived classes

  1. A Base Class pointer can point to a derived class object. Why is the vice-versa not true?

  2. assigning derived class pointer to base class pointer in C++

2 个答案:

答案 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;肖恩父母,这可能会让你大吃一惊。