• 为什么“一般而言,在基类和派生类中提供同名的nonvirtual函数,不是一个好的解决办法”


    今天在看Essential C++ 第5章时,看到这句话:

      一般而言,在基类和派生类中提供同名的non-virtual函数,并不是好的解决方法。基于此点而归纳出来的结论或许是:基类中的所有函数都应该被声明为virtual。我并不认为这是个正确的结论,但它的确可以马上解决我们所面临的两难困境。

      上述作者描述中的红色字体部分,暂时还不知道是什么原因。下面先举个例子说明一下为什么“在基类和派生类中提供同名的non-virtual函数,并不是好的解决方法”。

    1、Base.h文件:定义了一个display()函数

    1 class Base
    2 {
    3 public:
    4 Base(void);
    5 void display() const;
    6 virtual ~Base();
    7 };

    2、Base.cpp:实现这个display()函数

    1 Base::~Base()
    2 {
    3 std::cout << "Base destructor \n";
    4 }
    5
    6 void Base::display() const
    7 {
    8 std::cout << "Base display() function \n" ;
    9 }

    现在类Inherit继承Base类

    3、Inherit.h文件

    1 class Inherit
    2 :Base
    3 {
    4 public:
    5 Inherit(void);
    6 ~Inherit();
    7 void display() const;
    8 };

    4、Inherit.cpp文件

    1 Inherit::~Inherit()
    2 {
    3 std::cout << "Inherit destructor \n" ;
    4 }
    5
    6 vodi Inherit::display() const
    7 {
    8 std::cout << "Inherit display() function \n" ;
    9 }

    5、然后我们在main函数里面测试

    1 int _tmain(int argc, _TCHAR* argv[])
    2 {
    3 Base *pInherit = new Inherit();
    4 pInherit->display();
    5 }

    明显这里会调用基类的display(),这里只是简单的举例调用关系,如果我们的程序里面基类和派生类同名的函数里面有一些内存方面的操作,那这样如果程序比较大,就比较不容易查出来哪里出错了。。Essential C++书里面在这里的解决方法是在继承类里新建一个同名但参数不一样的函数,这样就不只是单独继承基类的函数。详细的代码可以看Essential C++ P153

  • 相关阅读:
    滑动窗口算法-2
    滑动窗口算法-1
    工作中缓存使用重点
    QPS的计算方法[转载]
    springAop
    spring配置详述与springboot
    LRU最少使用
    图片压缩
    Javassist使用[转载]
    [转]关于Spring事务嵌套回滚的一些测试总结
  • 原文地址:https://www.cnblogs.com/ziyoudefeng/p/2407037.html
Copyright © 2020-2023  润新知