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++解决二义性的方法

C#中基类属性值在子类中设置,如何在基类的方法中获取子类设置的值?

请教C++高手: 关于类的继承,当子类以public方式继承基类之后,根据继承的规则,基类的所有数据成员和成

嵌入式C语言面向对象编程 --- 继承

什么是类的继承性?Java中子类和父类有什么关系?

C ++中的私有继承以及如何重用但修饰基类的运算符? [复制]