C++调用超类

C++ calling super class

本文关键字:超类 调用 C++      更新时间:2023-10-16

我主要是一名Java和AS3程序员,但现在我正在C++中工作,偶然发现了一个问题。我有一个基类(我们称之为ClassA),它有一个私有变量var1。在这个类中,我有一个方法getVar1(),它返回一个指向该变量的指针。

接下来,我有另一个扩展Base的类(让我们称之为ClassB)。如何从超类中调用getVar1()?在java中,它就像this.var1=super.getVar1().一样简单

我读到它类似于var1=ClassA::getVar1(),但我不确定这是否适用于处理变量(也就是指针可以更改)。

谢谢。

可以将其称为ClassA::getVar1()。

但是,如果您想要java方式,您可以将该方法设置为"虚拟"。这意味着无论何时编写getVar1(),它都不取决于您在它前面编写的Type(所以在编译时),而是取决于您调用它时(在运行时)对象的类型。出于这个原因,c++保留了一个内部v表来查找合适的方法。它相当于java方式,称为后期绑定。

getVar1()应该足够

class ClassB : public ClassA
{
...
   void foo() { yourvartype* v = getVar1(); ... }
};

如果OTOH在ClassB中定义了另一个getVar1(),则应使用ClassA::getVar1()来帮助编译器确定要调用的函数。

下面是一个小例子,展示了发生的情况:-A将x初始化为10-B将x初始化为20下面你可以看到虚拟函数调用是如何工作的,以及调用你的父函数是如何工作(即使你初始化的值不同)

最需要记住的是,即使你调用了你的超级函数(A::GetX),它仍然使用你自己类的值(B::x)

class A
{
public:
    A::A() : x(10) {}
virtual int GetX() {return x*2;}
protected:
    int x; 
};
class B : public A
{
public:
    B::B() : A()
    {
        x = 20;
    }
    virtual int GetX() {return x;}
};
int _tmain(int argc, _TCHAR* argv[])
{
    A* a1 = new A();
    B* b1 = new B();
    int test1 = a1->GetX(); // returns 20 (because x is 10, but function doubles value)
    int test2 = b1->GetX(); // returns 20 (because x is initialized at 20)
    return 0;
}

现在,如果我们将B::GetX更改为:

virtual int GetX() {return A::GetX();}

我们得到以下结果:

int _tmain(int argc, _TCHAR* argv[])
{
A* a1 = new A();
B* b1 = new B();
int test1 = a1->GetX(); //returns 20 (as previously)
int test2 = b1->GetX(); // return 40 (x is initialized by B at 20, but then the
                        // A:GetX is called, which doubles the result)
return 0;
}