代码之家  ›  专栏  ›  技术社区  ›  Vijay

C++中虚拟函数的访问问题

  •  20
  • Vijay  · 技术社区  · 14 年前

    我被问到这个疯狂的问题。 我疯了。

    是否可以使用指向派生类对象的基类指针调用基类中声明为虚拟的方法?

    这有可能吗?

    8 回复  |  直到 12 年前
        1
  •  50
  •   Alan    14 年前

    如果您试图从基类指针调用一个虚拟方法,那么是的。

    这就是多态性。

    如果您要求,用一个指向派生类的基类指针,可以调用一个被派生类重写的基类方法吗?是的,也可以通过显式地限定基类名称的范围:

    basePtr->BaseClass::myMethod();

        2
  •  16
  •   el.pescado - нет войне    14 年前

    尝试:

    class A            { virtual void foo(); }
    class B : public A { virtual void foo(); }
    
    A *b = new B();
    b->A::foo ();
    
        3
  •  10
  •   CB Bailey    14 年前

    你的意思是这样的。(何处) pBase 是指向基的指针类型,但指向对象实际上是类型 Derived 它是从 Base )

    pBase->Base::method();
    

    是的,这是可能的。

        4
  •  10
  •   Jerry Coffin    14 年前

    是--但是您必须指定全名:

    #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;
    }
    
        5
  •  5
  •   BatchyX    14 年前

    如果我正确理解这个问题,你就知道

    class B 
    {
    public: 
        virtual void foo();
    };
    
    class D: public B
    {
    public:
        virtual void foo();
    }
    
    B* b = new D;
    

    问题是,你能打电话给我吗 B::foo() . 答案是“是”,使用

    b->B::foo()
    
        6
  •  0
  •   Pardeep    14 年前
    class B 
    {
    public: 
        virtual void foo();
    };
    
    class D: public B
    {
    public:
        virtual void foo();
    }
    
    B* b = new D;
    

    尝试呼叫

    (*b).foo()
    

    调用基类foo函数

        7
  •  0
  •   gary    12 年前
    class B { 
        public: virtual void foo(); 
    };
    
    class D: public B { 
        public: virtual void foo() 
        { 
            B::foo();
        }; 
    }
    
    B* b = new D;
    

    解决:

    1. b->foo();
    2. b->B::foo()

    3. 或者不要重写/定义派生类d中的foo()并调用b->foo()。

    4. B objb = *b; objb.foo() ; // this is object slicing and not (*b).foo() as in one of the previous answers

        8
  •  -1
  •   Sudesh Sawant    14 年前

    不,不干净。但是,是的。您必须执行一些指针操作,获取指向vtable的指针并进行调用。但这并不是指向基类的指针,而是一些智能的指针操作。另一种方法是在基类上使用范围解析操作符。