gpt4 book ai didi

c++ - 覆盖采用继承结构的函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:29 24 4
gpt4 key购买 nike

struct struct1
{};
struct struct2:public struct1
{};
class Base
{
public:
virtual void foo(struct1 *s)
{
cout<<"foo in Base"<<endl;
}
};
class Der:public Base
{
public:
virtual void foo(struct2 *s)
{
cout<<"Foo in Der"<<endl;
}
};
int main()
{
struct2 s;
Base *b = new Der();
b->foo(&s);
}

当我调用 main 中的函数时,它调用 Base 中的成员。“foo in Base” 被打印出来。当 Derived 类函数采用 struct1 指针时,它会打印“foo in Der”。但是有没有办法让它接受 struct2 指针并显示“foo in Der”

最佳答案

你在要求什么,解释你的意思是覆盖 Base::foo 的行为, 将是函数的协变参数,这在 OO 中是不可能的,因为派生类型会缩小基类型的契约(Contract)范围,因此会违反 Liskov 替换原则。您将无法替换 Base 类型的对象使用 Der 类型的对象,因为后者不接受 struct1不是 struct2 的对象对象。

当派生类型函数具有相同的签名(即也采用 struct1* )时,它会覆盖 Base 的行为然后动态调度开始。但是当你的签名有struct2*它不会覆盖而是隐藏 Base功能。

关于c++ - 覆盖采用继承结构的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15037266/

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