确保继承方法声明

时间:2011-03-21 06:01:10

标签: c++

如何防止意图定义继承定义的非继承方法。我被告知有诀窍表达它,但没有人能记得它。

解释。我有类的树:'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;
}

3 个答案:

答案 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