gpt4 book ai didi

c++ - 使用新运算符 c++ 的静态绑定(bind)

转载 作者:行者123 更新时间:2023-12-01 15:12:28 26 4
gpt4 key购买 nike

我想确定我是否理解正确。如果我有类似的东西:

Base* wsk = new Derived
如果我用静态绑定(bind)做到了这一点,那么 wsk 是 Base 类型,但仍然创建了派生类型对象?和 wsk指向该派生类型对象,但它不能使用派生类中的方法,因为 wsk是基本类型?总结一下对我来说最重要的问题是,如果 wsk除了它的 Base 类型仍然指向 Derived 类型的新对象?

最佳答案

如上所述,在查看 Base * 时,有一个重要的评论。它指向类型 Base .我没有使用这个符号来简化解释。
您要问的是一个不同的问题: 之间有什么区别?静态类型 动态/运行时类型 的一个对象。
让我们观察以下代码:

#import <iostream>

class Base
{
public:
virtual void foo()
{
std::cout << "From Base" << std::endl;
}
};

class A : public Base
{
public:
void foo() override
{
std::cout << "From A" << std::endl;
}

void some_A_only_function()
{
std::cout << "some function from A" << std::endl;
}
};

class B : public Base
{
public:
void foo() override
{
std::cout << "From B" << std::endl;
}

void some_B_only_function()
{
std::cout << "some function from B" << std::endl;
}
};


int main()
{
Base base{};
Base * a = new A();
Base * b = new B();

base.foo();

a->foo();
// a->some_A_only_function(); this won't compile: error: no member named 'some_A_only_function' in 'Base'

b->foo();
// b->some_B_only_function(); this won't compile either!!
}
输出是:

From Base

From A

From B


这里的所有对象都来自 Base 的静态类型,因此,您不能调用任何不属于 Base 的函数。 , 由于编译器 不能知道在运行时将哪种类型放在那里。如果我们有重写的函数,将根据运行时类型调用适当的函数(这称为 动态调度 )。
总结一下,这里有3个对象:
  • 静态类型的对象 Base和动态类型Base .
  • 静态类型的对象 Base和动态类型A .
  • 静态类型的对象 Base和动态类型B .

  • 使用 A功能的唯一方法或 B分别是通过使用强制转换将它们“返回”到它们的原始形式。但应该谨慎行事!
    大备注:这实际上在任何提供多态性的语言中都是正确的(据我所知)。它不是 C++ 独有的!

    关于c++ - 使用新运算符 c++ 的静态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63170278/

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