微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从基类对象访问子类变量

如何解决从基类对象访问子类变量

假设我在 C++ 中有以下类

class Animal{}
class Dog : public Animal {
    int barkingVolume;
}

但是,我没有 Dog 类的头文件。但是我在运行时有一个 Animal 类型的 Dog 对象。 问题是我如何访问变量barkingVolume
Animal animalButDogObject;//someone has set the value at runtime
我需要从animalButDogObject 访问barkingVolume。

来自 COM/Directshow 的实际场景:我有 IBaseFilter 对象,它是 IvendorFilter 类型(来自 3rd 方供应商的自定义过滤器,它扩展了 IBaseFilter)。在使用 Visual Studio 进行调试时,我可以看到类型是 IvendorFilter 并且它有我需要更改的变量。但是我不知道该怎么做。我在 CPP 中找不到类似反思/评估的东西

解决方法

我宁愿发表评论也不愿发表答案,但由于缺乏声誉而不能发表,所以我们开始吧。

这很糟糕,但是如果您知道必须访问的类的确切布局,您可以向前声明整个内容并reinterpret_cast您需要的对象。

// FooBar.cpp or something
namespace FooBar
{
    class Foo {};

    class Bar : public Foo
    {
        public:
            Bar(int ival,float fval) : ival(ival),fval(fval) {}
            int ival = 0;
            float fval = 0.0f;
    };
}

// OtherFile.cpp
class ForwardDeclaredBar
{
    public:
        int ival;
        float fval;
};

#include <iostream>

int main()
{
    FooBar::Foo* foo = new FooBar::Bar(3,2.7f);
    auto bar = reinterpret_cast<ForwardDeclaredBar*>(foo);
    std::cout << "ival = " << bar->ival << ",fval = " << bar->fval << std::endl; // shows expected values
    return 0;
}

同样,这很糟糕,因为对“真实”类的任何更改都会弄乱您的结果(reinterpret_cast 只会将它找到的任何数据推送到您指定的格式中)。

可能还有很多我不知道的其他原因。我也不确定这对更复杂的对象有多好(如果有的话)。

,

在 Animal(基)类上声明方法并在 Dog(派生)类上覆盖它。

// Base class
class Animal
{
public:
    virtual int getBarkingVolume() = 0;
};

// Derived class
class Dog : public Animal 
{
private:
    int barkingVolume = 8;

public:
    int getBarkingVolume()
    {
        return barkingVolume;
    }
};

在 main 方法中具有 Animal(基)类型,并且每个实现适当方法 (getBarkingVolume) 的派生类都将与该类型兼容。

int main()
{
    Animal* animal = new Dog();

    std::cout<<"barking: "<< animal->getBarkingVolume();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。