C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了防止覆盖和/或隐藏基类功能(C 11)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想要防止甚至隐藏基类非虚函数一段时间,因为我学习了C,我不确定这是否符合道德规范,但C 11特性给了我一个想法.假设我有以下内容

bases.h ….

#ifndef baseexample_h
#define baseexample_h

#include <iostream>

class Base{
    public:  
    void foo() {
        std::cout << "Base.foo()\n" << std::endl;
    }
};

class Derived: public Base{ 
    public:
    void foo(){
        std::cout << "Derived.foo()\n" << std::endl;
    }   
};

#endif

和main.cpp …

#include "bases.h"
#include <iostream>

int main()
{

    Base base;
    Derived derived; 

    base.foo();
    derived.foo();

    std::cin.get();

    return 0;
};

当然是输出

Base.foo()

Derived.foo()

因为派生的foo()函数隐藏了基本的foo函数.我想防止可能的隐藏,所以我的想法是将头文件基本定义更改为:

//.....
class Base{
    public:  
    virtual void foo() final {
        std::cout << "Base.foo()\n" << std::endl;
    }
};

class Derived: public Base{ 
    public:
    void foo(){ //compile error
        std::cout << "Derived.foo()\n" << std::endl;
    }   
};
//......

这似乎强制执行我想要的编译器错误,防止覆盖和/或隐藏在c中,但我的问题是,这是一个很好的做法,因为foo()从来不是一个虚拟函数开始?这是否有不利因为我有点滥用虚拟关键字?谢谢.

解决方法

我会说,是的,这是不好的做法.当你不想要它时,你引入了多态性,只是为了防止名称隐藏.

但名字藏匿有什么不好?显然,无论出于何种原因,Derived的设计都希望在其基类中隐藏函数foo;它就是它所做的 – 也许它自己调用Base :: foo然后执行Derived中所需的一些额外活动.

试图颠覆这一点已经够糟糕了;试图通过选择你不想要的语言功能来做到这一点甚至更糟.

如果你真的需要调用函数,请使用derived.base :: foo(),但要注意你实际上是在破坏Derived类的API,你应该使用它来记录.

大佬总结

以上是大佬教程为你收集整理的防止覆盖和/或隐藏基类功能(C 11)全部内容,希望文章能够帮你解决防止覆盖和/或隐藏基类功能(C 11)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。