如何防止意图定义继承定义的非继承方法。我被告知有诀窍表达它,但没有人能记得它。
解释。我有类的树:'Base'< - 'C'< - 'D',下面。 Base定义了纯虚函数。该函数在C中重新定义,然后在D中重新定义。但该函数有很长的参数列表。
在衍生链的某处,agrglist中存在微妙的错误,这使得D ::非继承。程序快速编译。并且在运行时调用错误的方法 当方法是非继承的时候,是否存在导致编译错误的技巧。
#include <iostream>
class Base {
public:
virtual void VeryLongFunctionName(int VeryLongArgumentList) = 0;
};
class C : public Base {
public:
void VeryLongFunctionName(int VeryLongArgumentList) {
std::cout << "C::\n";
}
};
class D : public C {
public:
void VeryLongFunctionNane(int VeryLongArgumentList) { // typo is intentional. It's the point of the question.
std::cout << "D::\n";
}
};
int main() {
Base *p = new D;
p->VeryLongFunctionName(0);
// the intention is to print D::. But it prints C::.
// How can we make compiler catch it.
return 0;
}
答案 0 :(得分:4)
不完全是你所要求的,但我使用这种形式来减少人为错误的机会:
class t_very_long_argument_list {
public:
t_very_long_argument_list(T1& argument1, const T2& argument2);
/* ... */
T1& argument1;
const T2& argument2;
};
int C::VeryLongFunctionName(t_very_long_argument_list& arguments) {
std::cout << "C::\n";
}
答案 1 :(得分:2)
为了这个目的,C ++ 0x引入了override
成员函数装饰器,已经在VC ++ 2005及更高版本中实现了:http://msdn.microsoft.com/en-us/library/41w3sh1c.aspx
或者,VC ++允许以下内容(可能是编译器特定的):
#include <iostream>
class Base {
public:
virtual void VeryLongFunctionName(int VeryLongArgumentList) = 0;
};
class C : public Base {
public:
void Base::VeryLongFunctionName(int VeryLongArgumentList) {
std::cout << "C::\n";
}
};
class D : public C {
public:
void Base::VeryLongFunctionNane(int VeryLongArgumentList) {
// ^^^^^^ now causes a compilation error
std::cout << "D::\n";
}
};
答案 2 :(得分:1)
您有编译错误 -
int VeryLongFunctionName(int VeryLongArgumentList)
应该返回一个int
,其中没有一个方法定义正在这样做。 int VeryLongFunctionName(int VeryLongArgumentList)
应该收到int
。
对 - &GT; VeryLongFunctionName(); //错误
修正后,您应该得到预期的结果。检查结果:http://ideone.com/wIpr9