我知道有些人认为我不应该从继承的类中重新定义非虚函数,但是,我现在正在做的就是使用那个角色迁移概念,并且它非常特殊,非常适合。< / p>
我想要的是这个(哦,这是C ++):
class A {
public:
void f() { doSomethingA(); }
};
class B : public A {
public:
void f() { A::f(); doSomethingB(); }
};
但是,当我这样做时,A::f
会被this == 0
调用,这显然会导致段错误。我做错了什么,或者这根本不可能?我当前的选择是使用静态函数并明确地传递对象,但我更喜欢这样。
是的,我可以用不同的方式对它们进行调用,但这种做法使得它们看起来与程序员看起来相似。我不能因为各种原因使它们变得虚拟(最突出的是角色迁移,我实际上想要根据我使用它的不同行为)。
任何帮助表示赞赏
修改的
谢谢大家回答,看来我在构建环境中偶然发现了一个错误,最小的测试用例运行得很顺利;转向优化也是如此。我想在问这个问题之前我本可以尝试一下,但我通常认为我做错了。
此处无处可看,继续前进..抱歉给您带来不便...... :)
答案 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(); }
};