我有以下代码:
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输出答案 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;
}