gpt4 book ai didi

c++ - 防止覆盖和/或隐藏基类函数 (C++ 11)

转载 作者:可可西里 更新时间:2023-11-01 16:39:59 25 4
gpt4 key购买 nike

自从我学习 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() 从来都不是虚拟的功能开始?因为我有点滥用 virtual 关键字,这有什么缺点吗?谢谢。

最佳答案

我会说,是的,这是不好的做法。您在不需要时引入了多态性,只是为了防止名称隐藏。

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

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

如果您确实需要调用基函数,请使用derived.Base::foo(),但请注意,您实际上是在破坏类的 API Derived,您应该按照记录使用它。

关于c++ - 防止覆盖和/或隐藏基类函数 (C++ 11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17641736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com