我被问到这个疯狂的问题。 我失去了智慧。
是否可以使用指向派生类对象的基类指针调用声明为virtual的基类中的方法?
这可能吗?
答案 0 :(得分:50)
如果您尝试从基类指针调用虚方法,是的。
那是多态性。
如果您要求使用基类指向派生类的指针,您是否可以调用派生类重写的基类方法?是的,通过明确确定基类名称的范围也是可能的:
basePtr->BaseClass::myMethod();
答案 1 :(得分:16)
尝试:
class A { virtual void foo(); }
class B : public A { virtual void foo(); }
A *b = new B();
b->A::foo ();
答案 2 :(得分:10)
你的意思是这样的。 (其中pBase
是指向基类型的类型,但指向的对象实际上是Derived
类型,它是从Base
派生的。)
pBase->Base::method();
是的,这是可能的。
答案 3 :(得分:10)
是 - 您必须指定全名:
#include <iostream>
struct base {
virtual void print() { std::cout << "Base"; }
};
struct derived : base {
virtual void print() { std::cout << "Derived"; }
};
int main() {
base *b = new derived;
b->base::print();
delete b;
return 0;
}
答案 4 :(得分:5)
如果我理解正确,你有
class B
{
public:
virtual void foo();
};
class D: public B
{
public:
virtual void foo();
}
B* b = new D;
问题是,你能打电话给B::foo()
吗?答案是肯定的,使用
b->B::foo()
答案 5 :(得分:0)
class B
{
public:
virtual void foo();
};
class D: public B
{
public:
virtual void foo();
}
B* b = new D;
尝试拨打
(*b).foo()
调用基类foo函数
答案 6 :(得分:0)
class B {
public: virtual void foo();
};
class D: public B {
public: virtual void foo()
{
B::foo();
};
}
B* b = new D;
解决方案:
b->foo();
b->B::foo()
或者不要在派生类D中覆盖/定义foo()并调用b-&gt; foo()
B objb = *b; objb.foo() ; // this is object slicing and not (*b).foo() as in one of the previous answers
答案 7 :(得分:-1)
没有。不是一个干净的方式。但是,是的。你必须做一些指针操作,获得一个指向vtable的指针并进行调用。但这并不是指向基类的指针,而是一些智能指针操作。另一种方法是在基类上使用范围解析运算符。