C ++如何访问基类的继承和覆盖属性的值?
Posted
技术标签:
【中文标题】C ++如何访问基类的继承和覆盖属性的值?【英文标题】:C++ how to access value of inherited and overridden attribute of base class? 【发布时间】:2017-12-05 21:18:52 【问题描述】:我尝试做这样的事情:
class A
public:
A()number = 1;
int number;
;
class B : public A
public:
B()number = 2;
;
class Base
public:
Base() myAttribute = new A();
int returnAttrNumber()return myAttribute->number;
A *myAttribute;
;
class Inherited : public Base
public:
Inherited()myAttribute = new B();
B *myAttribute;
;
int main()
Inherited *i = new Inherited();
std::cout << i->returnAttrNumber(); // outputs 1, because it gets the A not the B. I want it to output 2, to get the B object in returnAttrNumber()
因此,类 Base 拥有一个对象 A。Inherited 拥有一个 A 派生的对象 B。我尝试在基类上调用一个方法,但我希望它在相应 Object 的层次结构中向下转换可能(没有 static_cast 或 dynamic_cast)然后取 B 对象,而不是 A 并做一些事情(在这种情况下返回它的数字)
有没有办法从 C++ 中的基类向下转换而没有大的困难? 感谢您的回答!
【问题讨论】:
请贴一些实际的代码。细节很重要。 "这应该改变存储在 Inherited 中的值,而不是 Base" 只有一个成员可以改变它的值。请不要使用幻想代码。这有太多的语法错误,分散了实际问题的注意力 是的,对不起,我修好了,现在可以了 整个程序中你只有一个int变量...class Base virtual int get_myAttribute()=0; [...];
class Derived int myAttribute=10; int get_myAttribute() override return myAttribute;;
【参考方案1】:
这是非常糟糕的设计。快速回答是您可以通过完全限定标识符从基类访问变量。举个例子:
#include <iostream>
class A
public:
A()
: var(1)
protected:
int var;
;
class B : public A
public:
B()
: var(2)
int getBVar() const
return var;
int getAVar() const
return A::var;
private:
int var;
;
int main()
B b;
std::cout << "A: " << b.getAVar() << std::endl;
std::cout << "B: " << b.getBVar() << std::endl;
输出如下:
A: 1
B: 2
关于向下转换位... Base 和 Inherited 有 不同 变量。您不能安全地将一个案例转换为另一个案例。
【讨论】:
好的,谢谢!好吧,这将是可能的,尽管它不是很好,因为我的程序中的层次结构包括许多类。这对我来说似乎不是一个非常具体的问题,所以我想知道,为什么我不能放弃或者为什么对象不能给出提示,它是哪个继承类型(在基类中)......什么你的意思是设计很糟糕吗?有没有更好的方法来做到这一点(/像我的例子那样做那种并行的层次结构)? 因为您正在使用别名“myAttribute”。最初它们都指向同一个对象,但让我们假设 A 将 myArrtibute 更改为另一个实例。它对 B 的实现一无所知,因此无法对其进行更新。现在两个指针都指向不同的对象。【参考方案2】:正如rioki所说,
Base 和 Inherited 有不同的变量
这是因为我在 Inherited 中将 MyAttribute 重新声明为 B。这是错误的。我想,当我用相同的名称声明它时,它将是相同的变量,这是错误的。 因此,解决这个问题的整个解决方案是取消注释 Inherited 中的这一行。工作代码:
class A
public:
A()number = 1;
int number;
;
class B : public A
public:
B()number = 2;
;
class Base
public:
Base() myAttribute = new A();
int returnAttrNumber()return myAttribute->number;
A *myAttribute;
;
class Inherited : public Base
public:
Inherited()myAttribute = new B();
//B *myAttribute;
;
int main()
Base *i = new Inherited(); // this works, what is necessary in my case
std::cout << i->returnAttrNumber(); // outputs 2 now
【讨论】:
以上是关于C ++如何访问基类的继承和覆盖属性的值?的主要内容,如果未能解决你的问题,请参考以下文章
C#中基类属性值在子类中设置,如何在基类的方法中获取子类设置的值?