繁体   English   中英

调用基类函数

[英]calling base class functions

我有以下课程。

class A
{

public:

void fun();

}

class B: public A
{

}

class C: public A
{

}

A * ptr = new C;

可以做下面的事情吗? 如果在基类中引入一些虚函数,我会遇到一些问题吗?

((B *)ptr)->fun();

这可能看起来很愚蠢,但是我有一个通过B调用A的函数的函数,而我不想更改它。

您不能将指向C的A *转换为B *,因为Class C与Class B没有任何关系。您会得到未定义的行为,这可能是错误的函数,并且导致堆栈损坏。

如果您打算让C类从B类派生,那么您可以。 但是,您不需要。 如果类C没有定义fun(),它将继承A的。 但是,您并未将fun()声明为虚拟的,因此,即使您实现C :: fun()或B :: fun(),也会得到奇怪的行为。 您几乎可以肯定希望将fun()声明为虚拟的。

您不必进行强制转换(B *)ptr-> fun(); 因为fun()已经在基类中。 在您的示例中,类B或C的两个对象都将调用相同的fun()函数。

我不确定当您覆盖类B中的fun()函数时会发生什么...

但是在我看来,尝试从另一个类(而不是基类)调用函数是不好的面向对象。

我在这里猜测,但是我怀疑它的行为可能取决于您使用的编译器及其决定组织vf指针表的方式。

我还要指出的是,我认为您正在做的事情不是一个好主意,并且可能导致各种噩梦般的问题(使用诸如static_cast和dynamic_cast之类的东西通常是个好主意)。 另一件事是因为fun()是在基类中定义的(并且它不是虚拟的),所以ptr-> fun()将始终调用A :: fun(),而不必将其强制转换为B *。

您可以将A *强制转换为B *,并且如果原始指针为B *则应该可以使用。

A* p = new B;
B* q = static_cast<B*>(p); // Just work (tm)

但是在这种情况下,它是一个C *,并且不能保证正常工作,您将以一个悬空的指针结尾,如果幸运的话,您将遇到访问冲突,否则,您将以无声方式破坏内存。

A* p = new C;
B* q = static_cast<B*>(p); // Owned (tm)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM