C ++覆盖基本成员值

时间:2017-08-15 04:04:31

标签: c++ class inheritance base derived

我有以下代码:

class A
{
public:
    int foo = 0;
};

class B: public A
{
public:
    int foo = 1;
};

int main()
{
    A *a = new B();

    std::cout << a->foo;
    std::getchar();

    return 0;
}

输出:0

B为什么不从A?

覆盖成员foo

以及如何在不转换为派生类

的情况下获得所需的1输出

4 个答案:

答案 0 :(得分:3)

您只能覆盖 angular.module('blah') .controller('app.page1', function($scope, $state) { // on page load if($state.params.stocksymLen <= $state.params.stockCondition) { // do your REST call ... else { ... } }); 成员函数 所有其他成员,无论是函数,类型还是成员变量,都只能阴影

这意味着它们根本没有变化,但是在没有使用适当的基础,使用范围分辨率运算符等的情况下,不容易访问它们。

因此,改为使用虚函数而不是成员变量。

答案 1 :(得分:2)

使用虚拟功能。您不能拥有虚拟字段,因此您获得的值是实例指针的类型(A),而不是指向的实际类型(B)。

#include <iostream>
using namespace std;

class A
{
    int foo_ = 0;
public:
    virtual int foo() const { return foo_; }
    virtual ~A(){}
};

class B: public A
{
    int foo_ = 1;
public:
    virtual int foo() const { return foo_; }
};

int main()
{
    A *a = new A();
    A *b = new B();

    cout << a->foo() << '\n';
    cout << b->foo() << '\n';
    cin.ignore();

    delete a;
    delete b;
}

答案 2 :(得分:2)

B::foo是与A::foo完全独立的成员。这就是初始化B::foo不会更新A::foo的原因。你不得不做更像这样的事情:

class
{
public:
    int foo;
    A(int value = 0) : foo(value) {} 
};

class B : public A
{
public:
    B() : A(1) {}
};

int main()
{
    A *a = new B();
    std::cout << a->foo;
    delete a;
    std::getchar();
    return 0;
}

答案 3 :(得分:0)

由于您希望使用多态行为,因此您可以为成员变量“foo”编写虚拟getter方法,因为无法直接以多态方式访问数据成员。

您在下面修改了示例代码段以实现该目标 -

class A
{
    int foo;
public:
    A() { foo = 0; }
    virtual int getFoo() { return foo; }
};

class B: public A
{
   int foo;
public:
    B() { foo = 1; }
    virtual int getFoo() { return foo; }
};

int main()
{
    A *a = new B();

    std::cout << a->getFoo();
    std::getchar();

    return 0;
}