warning C4250: “MyClassD”: 通过域控制继承“MyClassC::MyClassC::MyMethod”

简介: warning C4250: “MyClassD”: 通过域控制继承“MyClassC::MyClassC::MyMethod”

菱形继承的警告,如下代码所示:

#include <stdio.h>
#include <string> 
 
class MyClassA
{
public:
        virtual void MyMethod() = 0;
};
 
 
 
class MyClassB : virtual public MyClassA
{
 
};
 
 
class MyClassC : virtual public MyClassA
{
public:
        virtual void MyMethod()
         {
                   printf("Hello, World!\n");
         }
};
 
 
 
class MyClassD : virtual public MyClassB, virtual public MyClassC
{
 
public:
 
};
 
 int main(int argc, char* argv[])
{
         MyClassD myClassD;
 
         myClassD.MyMethod();
 
 
         return 0;
 
}
AI 代码解读

[问题如下]

会报如下两个错误:

1>e:\e\c++\201212月\staticobjectdemo\staticobjectdemo\staticobjectdemo.cpp(49): warning C4250: “MyClassD”:通过域控制继承“MyClassC::MyClassC::MyMethod”

1>e:\e\c++\201212月\staticobjectdemo\staticobjectdemo\staticobjectdemo.cpp(40) : 参见“MyClassC:: MyMethod”的声明
AI 代码解读

查了下,没有更好的消除解决的方法,笔者认为这是由于菱形继承的特征性所决定的。

解决方案:

一般下可以通过以下方法消除警告!

#pragma warning(push)

#pragma warning(disable:4250) //显然此处的警告号为4250,其他的警告换相对应的编号即可。

……….  //此处加上对应的语句,注意一定要保证弹出警告的语句在diable:4250后,在pop前!

#pragma warning(pop)
AI 代码解读

扩展:

【msdn】#pragma warning含义——允许选择性的更改编译警告消息的行为。

使用形式如下:

#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...] )

#pragma warning( push[ ,n ] )

#pragma warning( pop )
AI 代码解读
Warning-specifier 含义
1, 2, 3, 4 应用于给定指定警告的级别,也用来使指定的缺省的警告关闭。
default 重置警告行为为其缺省值,也能用于将缺省的警告关闭。这个警告缺省的产生。
disable 不再弹出指定编号的的警告消息。用法:#pragma warning(disable:4250)
error 把指定的警告消息报告称为错误(Error)。
default 重置警告行为为其缺省值,也能用于将缺省的警告关闭。这个警告缺省的产生。
suppress 把pragma的当前状态放置入栈,使得下一行的指定的警告不起作用,然后弹出警告栈,重置pragma状态。你只能对每一个suppress指示器指定一次警告,不能指定多个并且,suppress仅支持C6000的警告(代码分析警告),该警告可通过编译选项使其有效。

作者:铭毅天下
原文:https://blog.csdn.net/laoyang360/article/details/8179844
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
Java修饰符与封装:理解访问权限、行为控制与数据隐藏的重要性
Java中的修饰符和封装概念是构建健壯、易维护和扩展的Java应用程序的基石。通过合理利用访问权限修饰符和非访问修饰符,开发者能够设计出更加安全、灵活且高效的代码结构。封装不仅是面向对象编程的核心原则之一,也是提高软件项目质量和可维护性的关键策略。
58 1
|
7月前
|
set() 和 freezeset() 之间有什么区别?
【8月更文挑战第29天】
55 6
深入理解 Java 修饰符与封装:访问权限、行为控制与数据隐藏
ava 修饰符 用于控制类、属性、方法和构造函数的访问权限和行为。它们可以分为两组: 访问修饰符: public: 意味着代码对所有类可访问。 private: 意味着代码只能在声明的类内部访问。 default: 意味着代码只能在同一包中访问。 protected: 意味着代码在同一包和子类中可访问。 非访问修饰符: final: 意味着类不能被继承,属性和方法不能被重写。 static: 意味着属性和方法属于类,而不属于对象。 abstract: 意味着类不能用于创建对象,方法没有主体,必须由子类提供。 transient: 意味着在序列化包含它们的对象时,属性和方法将被跳过。 sync
205 0
c++11标准 类默认函数的控制:"=default" 和 "=delete"函数
c++11标准 类默认函数的控制:"=default" 和 "=delete"函数
304 0
warning C4250: “MyClassD”: 通过域控制继承“MyClassC::MyClassC::MyMethod”
warning C4250: “MyClassD”: 通过域控制继承“MyClassC::MyClassC::MyMethod”
358 0
重构——20将值对象改为引用对象(Change Value to Reference)
将值对象改为引用对象(Change Value to Reference):你从一个类衍生出许多彼此相等的实例,希望将它们替换为同一对象;将这个值对象变成引用对象
1391 0
重构——21将引用对象改为值对象(Change Reference to Value)
将引用对象改为值对象(Change Reference to Value):你有一个引用对象,很小且不可改变,而且不容易管理;将它变为一个值对象
1434 0