调用已重新定义的基类非虚函数?

时间:2010-11-03 15:13:27

标签: c++ inheritance

我知道有些人认为我不应该从继承的类中重新定义非虚函数,但是,我现在正在做的就是使用那个角色迁移概念,并且它非常特殊,非常适合。< / p>

我想要的是这个(哦,这是C ++):

class A {
 public:
 void f() { doSomethingA(); }
};
class B : public A {
 public:
 void f() { A::f(); doSomethingB(); }
};

但是,当我这样做时,A::f会被this == 0调用,这显然会导致段错误。我做错了什么,或者这根本不可能?我当前的选择是使用静态函数并明确地传递对象,但我更喜欢这样。

是的,我可以用不同的方式对它们进行调用,但这种做法使得它们看起来与程序员看起来相似。我不能因为各种原因使它们变得虚拟(最突出的是角色迁移,我实际上想要根据我使用它的不同行为)。

任何帮助表示赞赏

修改
谢谢大家回答,看来我在构建环境中偶然发现了一个错误,最小的测试用例运行得很顺利;转向优化也是如此。我想在问这个问题之前我本可以尝试一下,但我通常认为我做错了。

此处无处可看,继续前进..抱歉给您带来不便...... :)

5 个答案:

答案 0 :(得分:1)

假设B没有从A继承是一个错字(我不能看到这个编译),它看起来像你最初调用的B指针{{1 }} 一片空白。检查原始呼叫点,因为(假设拼写错误)你写的内容应该有效。

答案 1 :(得分:1)

您的代码似乎不太适合文本。在文中,你谈到继承,但代码没有显示任何(至少原样,它甚至不应该编译)。

如果你使用继承:

class A { 
public:
    void f() { doSomethingA(); }
};

class B : public A { 
public:
    void f() { A::f(); doSomethingB(); }
};

然后当你调用A::f()时,this肯定是一个NULL指针 - 它应该是指向A“子对象的有效指针”在B对象中(只要您使用单继承,对于大多数编译器,它将是您调用的对象B::f()的地址,只需从B * const转换为{{ 1}})。

答案 2 :(得分:1)

尝试

static_cast<A*>(this)->f()

应该工作。

编辑:

如果没有,请先在this中查看B::f()

答案 3 :(得分:0)

您没有指定B继承自A:

class B : public A {

答案 4 :(得分:0)

忽略这样做的“正确性”,你所描述的内容并没有错。我假设您的示例代码看起来更像是以下但实际上有您描述的继承:

struct A {
 void f() { cout << "hi" << endl; }
};
struct B : public A {
 void f() { A::f(); }
};