【发布时间】:2013-07-23 02:06:09
【问题描述】:
在 C++ 中,如果我们在某个基类(比如 Base)中有一些虚函数,我们想覆盖这个虚函数,我们必须再次声明这个虚函数以使其在派生类中也能工作.
class Base {
public:
virtual void virtualFunction();
static int s_whatSoEver[];
private:
void _privateFunction();
}
class Derived {
public:
virtual void virtualFunction();
}
这不是很愚蠢吗,因为如果我们想要更改虚函数原型,就必须更改派生-s 的每个声明?
另外,为什么要在头文件中声明一些受保护或私有的函数,因为头文件是用于公共接口定义的,而使用该接口的用户根本不需要关心它们?也许我们可以像 Objective-C 一样直接在 .cpp 文件中实现和声明私有或受保护的函数。
C++ 也没有静态初始化器,如果我们想初始化一些静态类变量,我们必须为此创建一个类:
class BaseStaticVariableInitializer {
public:
BaseStaticVariableInitializer() {
Base::s_whatSoEver = new int[20];
for (int i = 0; i < 20; i++) {
s_whatSoEver[i] = xxx;
}
}
~BaseStaticVariableInitializer() {
delete [] Base::s_whatSoEver;
}
}
并专门为其初始化一个静态类常量:
static BaseStaticVariableInitializer s_baseStaticVariableInitializer;
对不起,我的无知,但是您编写 C++ 代码以适应 DRY 的正确方法是什么?
【问题讨论】:
-
一篇文章有很多问题....
-
我肯定会把关于静态初始化的问题视为一个单独的问题。 (部分回答这个问题,C++11 统一初始化将帮助您大大简化这一点。)
-
顺便说一句,
delete是new[]-ed 的未定义行为。你应该delete[]那段记忆。 -
@DavidRodríguez-dribeas 感谢您的更正,我已经更正了。