如何解决从基类对象访问子类变量
假设我在 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 举报,一经查实,本站将立刻删除。