gpt4 book ai didi

c++ - 调用基类方法 : accessing member of derived class

转载 作者:行者123 更新时间:2023-11-30 01:57:06 26 4
gpt4 key购买 nike

假设我们有两个类:

class Parent
{
public:
vector<int> x;
protected:
void Method();
}

class Child : public Parent
{
public:
vector<double> x;
}

和方法Method()x 上运行并进行一些操作,这两种类型都兼容 intdouble :

void Parent::Method() 
{
x.push_back(1);
}

然后,如果我要创建 Child 的实例类,初始化 vector<double> x , 然后调用派生方法 Method()从基类开始,C++ 将尝试对 Parent 进行操作的成员(member)x而不是 Child的一个。有没有办法让基类方法自动操作属于创建类的成员,Childvector<int> x

编辑:正如 McAden 正确指出的那样,可以使用多态性轻松实现此行为:三个类 - 1 个基类和 2 个派生类。但这是否意味着只有 2 个类是不可能的?

最佳答案

因为您只想创建 Child 的实例你想要 Child指定 vector 的类型,使用模板更自然地解决了这个问题 Parent .举个简单的例子,Parent可以用什么参数化 vector<>应包含:

template <typename T>
class Parent {
public:
std::vector<T> x;
protected:
void Method () { x.push_back(1); }
};

class Child : public Parent<double> {
//...
};

如果您实际上有很多这样的东西,您希望 child 在 Parent 中控制, 那么你可能应该对待 Child更像是 Parent 的特征类.因此,Parent实际上会被它的 Child 参数化,然后您的代码将使用 CRTP .它提供了“静态多态性”。

template <typename CHILD>
class Parent {
protected:
void Method () {
CHILD *child = static_cast<CHILD *>(this);
child->x.push_back(1);
}
};

class Child : public Parent<Child> {
public:
std::vector<double> x;
};

关于c++ - 调用基类方法 : accessing member of derived class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19127080/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com