C++ 确保方法声明被继承

C++ 确保方法声明被继承,c++,C++,如何防止意外定义非继承的方法,而继承的定义是用来定义的。有人告诉我有表达它的诀窍,但没人能回忆起来 解释。我有一个类树:“Base”你有编译错误- int-VeryLongFunctionName(int-VeryLongArgumentList)应该返回一个int,但没有一个方法定义这样做 int-VeryLongFunctionName(int-VeryLongArgumentList)应该接收一个int p->VeryLongFunctionName();//错误 纠正这些错误后,您应

如何防止意外定义非继承的方法,而继承的定义是用来定义的。有人告诉我有表达它的诀窍,但没人能回忆起来


解释。我有一个类树:“Base”你有编译错误-

  • int-VeryLongFunctionName(int-VeryLongArgumentList)
    应该返回一个
    int
    ,但没有一个方法定义这样做
  • int-VeryLongFunctionName(int-VeryLongArgumentList)
    应该接收一个
    int

    p->VeryLongFunctionName();//错误


纠正这些错误后,您应该会得到预期的结果。检查结果:

不完全符合您的要求,但我已使用此表单来减少人为错误的可能性:

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";
}
类t\u非常长\u参数\u列表{
公众:
非常长的参数列表(T1和参数1,常数T2和参数2);
/* ... */
T1&1;
const2&2;
};
int C::VeryLongFunctionName(非常长的参数列表和参数){

std::cout正是出于这个目的,C++0x引入了
覆盖
成员函数装饰器,这在VC++2005及更高版本中已经实现:

或者,VC++允许以下操作(可能是特定于编译器的):

#包括
阶级基础{
公众:
虚拟void VeryLongFunctionName(int VeryLongArgumentList)=0;
};
丙级:公共基地{
公众:
void Base::VeryLongFunctionName(int VeryLongArgumentList){

std::cout
p->VeryLongFunctionName()Prason:你认为一个“键入”是问题的一部分。问题是编译器如何捕获错误。但是代码编译并运行。如果需要的话,请重读解释。@ BATBA:你认为“键入”是问题的一部分。问题是编译器如何捕获错误。但是代码编译了一个错误。nd运行。如果需要,请重新阅读说明P->VeryLongFunctionName()是一个错误,因为您没有传递它的参数int VeryLongArgumentList。@Andrei:它不编译。请检查它@Andrei-您正在使用的编译器是什么?请确保您在问题中包括编译器及其版本。否则,许多用户试图给您建议使用他们拥有的编译器编译程序。宾果。'ov它是错误的。遗憾的是在g++…中还没有。Base::stuff没有在g++@Andrei:Edited中编译,以反映
Base::
stuff是VC++特有的。
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";
}
#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";
    }
};