C 协方差意外行为
C++ covariance unexpected behaviour
我得到了意外的结果,我无法解释自己。
尽管在生成对象上使用朋友operator<<
时,生成了同一类BASIC2
的对象(从BASIC1
继承)。
请参阅下面的代码
我让D
(从Base
继承的类Derived
的对象)生成类BASIC2
的对象,并将其称为朋友operator<<
。这会产生预期消息"BASIC2 object"
。
我让B
生成类BASIC1
的对象,并致电其朋友operator<<
。如我所期望的那样,这将输出"BASIC1 object"
。
然后,我使用虚拟继承来让B2
(Base* B2 = &D;
)生成BASIC2
的对象。我遵循调试器(Visual Studio 2010)中的代码流,这正确生成了BASIC2
的对象。但是,朋友operator<<
未在BASIC2
对象上调用,而是使用类BASIC1
的朋友operator<<
(因此输出"BASIC1 object"
)。
请注意,我确实希望BASIC2
从BASIC1
继承,因为我想利用协方差行为。
int main(int argc, char* argv[]) {
Base B;
Derived D;
Base* B2 = &D;
std::cout << *D.generate(0) << std::endl;
std::cout << *B.generate(0) << std::endl;
std::cout << *(B2->generate(0)) << std::endl;
system("pause");
}
输出为:
基本2对象basic1对象basic1对象
class BASIC1 {
public:
friend std::ostream& operator<<(std::ostream& os, const BASIC1& basic) {
os << "BASIC1 object";
return os;
}
};
class BASIC2 : public BASIC1 {
friend std::ostream& operator<<(std::ostream& os, const BASIC2& basic) {
os << "BASIC2 object";
return os;
}
};
class Base {
public:
virtual BASIC1* generate(double num) const {
return new BASIC1();
}
protected:
private:
};
class Derived : public Base {
public:
virtual BASIC2* generate(double num) const override {
return new BASIC2();
}
protected:
private:
};
选择运算符&lt;&lt;基于在编译时间中已知对象的静态类型。为了实现您想要的目标,不要定义两个操作员&lt;&lt;功能,但仅在基本1中:
friend std::ostream& operator<<(std::ostream& os, const BASIC1& basic) {
Write(os);
return os;
}
并定义虚拟函数在basic1和basic2中写入您想要的事情:
virtual void Write(std::ostream& os) const {
os << "BASIC1 object";
}
谢谢!对我而言,我的问题的结局是:如果您调用朋友操作员&lt;&lt;(std :: ostream&amp; os,const base&amp; object)在通过动态调度生成对象的对象上。您需要在操作员中使用虚拟功能&lt;&lt;允许动态调度操作员&lt;&lt;。
相关文章:
- 为什么是谷神星协方差.计算()似乎永远运行而不返回?
- 为什么需要返回指针来利用协方差?
- Eigen对修复非正定义的协方差矩阵有解吗
- 回调参数中的协方差C++
- 获取长双精度向量的方差
- 我在计算 4 个值的方差时的错误在哪里
- C++容器、协方差和模板
- "shared_ptr"如何实现协方差?
- C++协方差返回类型的缺点是什么
- 我遇到了一个关于多线程的小问题.需要多线程来计算 Pi 和方差
- 如何在犰狳中使用变量/方差函数
- 用c++计算平均值和方差
- 如何实现支持模板协方差的通用工厂
- C 协方差意外行为
- 练习:使用数组计算方差
- 带有指针返回问题的c++协方差问题
- 计算OpenCV中的协方差
- 使用 OpenCV 计算协方差矩阵
- C++类设计:协方差
- 逆方差的常见编程用法是什么?