用虚函数初始化结构

Posted

技术标签:

【中文标题】用虚函数初始化结构【英文标题】:Brace Initialize struct with virtual functions 【发布时间】:2021-06-24 08:26:42 【问题描述】:

Brace initialization

        struct A
        
            int a;
            int b;
            void foo()
        ;

        A a1, 2;

它工作正常。但是如果把 foo 改成虚函数,就不会编译出错了,

错误 C2440“正在初始化”:无法从“初始化程序列表”转换为

我找到this,

聚合是没有用户提供的数组或类(第 9 条) 构造函数(12.1),没有私有或受保护的非静态数据成员 (第 11 条),无基类(第 10 条),无虚函数 (10.3)。

但这背后的原因是什么?

【问题讨论】:

我可能完全错了,但我知道你发布的链接中提到的一些东西,比如虚拟方法、私有或受保护的非静态、基类,......可以(或真的 100 % do) 更改内存中对象的布局(添加 vptr、privates 和 protected 可能会被编译器重新排列 - 其中任何一个也会破坏std::is_standard_layout<T>。所以也许这不会允许聚合按预期工作. 用户提供的构造函数是另一回事 - 对我来说这是关于如何在它和聚合 init 之间进行选择。您可以使用 initializer_list 添加一个 ctor 【参考方案1】:

你为什么不使用带有virtual void foo() 的参数化构造函数

struct A

    int a;
    int b;
    A(int a, int b)
    
        this->a = a;
        this->b = b;
    
    virtual void foo() 
;
A a 1, 2 ; 

【讨论】:

这个构造函数的想法还不错,但我更喜欢:A(int a, int b): a(a), b(b) ,即更喜欢初始化器而不是赋值(尽管它可能不会对ints 产生影响)。

以上是关于用虚函数初始化结构的主要内容,如果未能解决你的问题,请参考以下文章

面向对象用虚函数计算各种图形的面积 (10 分)

C++虚函数与非虚函数的区别。

“纯虚函数调用”崩溃从何而来?

在c++中虚函数和多态性是啥意思

C++中的虚函数(类的向上转换,和向下转换)

多态(C++版)