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

简介: 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;

}


[问题如下]


会报如下两个错误:


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


1>e:\e\c++\2012年12月\staticobjectdemo\staticobjectdemo\staticobjectdemo.cpp(40) : 参见“MyClassC:: MyMethod”的声明


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


解决方案:


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


#pragma warning(push)


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


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


#pragma warning(pop)


扩展:


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


使用形式如下:


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


#pragma warning( push[ ,n ] )


#pragma warning( pop )


warning-specifier警告标识符如下:


Warning-specifier


含义


1, 2, 3, 4


应用于给定指定警告的级别,也用来使指定的缺省的警告关闭。


default


重置警告行为为其缺省值,也能用于将缺省的警告关闭。这个警告缺省的产生。


disable


不再弹出指定编号的的警告消息。用法:#pragma warning(disable:4250)


error


把指定的警告消息报告称为错误(Error)。


once


仅显示指定的警告消息一次。


suppress



把pragma的当前状态放置入栈,使得下一行的指定的警告不起作用,然后弹出警告栈,重置pragma状态。你只能对每一个suppress指示器指定一次警告,不能指定多个并且,suppress仅支持C6000的警告(代码分析警告),该警告可通过编译选项使其有效。


相关文章
|
3月前
|
安全 Java 开发者
Java修饰符与封装:理解访问权限、行为控制与数据隐藏的重要性
Java中的修饰符和封装概念是构建健壯、易维护和扩展的Java应用程序的基石。通过合理利用访问权限修饰符和非访问修饰符,开发者能够设计出更加安全、灵活且高效的代码结构。封装不仅是面向对象编程的核心原则之一,也是提高软件项目质量和可维护性的关键策略。
21 1
|
安全 网络协议 数据安全/隐私保护
Printer Spooler 配置基于资源的约束委派利用记录
Printer Spooler 配置基于资源的约束委派利用记录
Printer Spooler 配置基于资源的约束委派利用记录
|
存储 程序员 编译器
c++11标准 类默认函数的控制:"=default" 和 "=delete"函数
c++11标准 类默认函数的控制:"=default" 和 "=delete"函数
268 0
|
域名解析 C++
warning C4250: “MyClassD”: 通过域控制继承“MyClassC::MyClassC::MyMethod”
warning C4250: “MyClassD”: 通过域控制继承“MyClassC::MyClassC::MyMethod”
924 0
重构——21将引用对象改为值对象(Change Reference to Value)
将引用对象改为值对象(Change Reference to Value):你有一个引用对象,很小且不可改变,而且不容易管理;将它变为一个值对象
1418 0
重构——20将值对象改为引用对象(Change Value to Reference)
将值对象改为引用对象(Change Value to Reference):你从一个类衍生出许多彼此相等的实例,希望将它们替换为同一对象;将这个值对象变成引用对象
1371 0