是什么区别public,private以及protected用C++继承?我在SO上发现的所有问题都涉及具体案例.
子类是否继承,主类的朋友关联(主类'自己和其他类与主类相关)?
或者换句话说,继承如何应用于friend关键字?
扩展:如果没有,有没有办法继承友谊?
我遵循Jon的建议来提出设计问题:
C++类设计问题
以下简单示例将产生编译器错误,因为我意外地使用私有继承:
main.cpp:21:错误:'A'是'B'无法访问的基础
class A
{
};
class B : /*ups forgot that -> public*/ A
{
};
int main(int , char *[])
{
A* test = new B;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你能不能帮我解释一下究竟是在基类交通不便,为什么需要从转换B*到A*?
在c ++中导出为protected或private有什么区别?我无法弄清楚,因为两者似乎都限制了派生类对象的基类成员访问
可能重复:
什么是访问说明符?我应该继承私人,受保护还是公共?
C++中private,public和protected继承之间的区别
对于所有cpp专家,在c ++继承中,
class B : public A {
};
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么关键字public需要在这里?这是什么意思吗?
我最近做了一些Windows Api编码(仍在做).我试图找到将WNDCLASSEX包装成C++类的最佳方法,当我有这个疯狂的想法时,WNDCLASSEX是一个结构对吗?(尽管它是用c编写的)并且在C++中结构被视为类,所以为什么我不将我的WinCLass声明为WNDCLASSEX的衍生物,所以我试过:
class WinClass : protected WNDCLASSEX
Run Code Online (Sandbox Code Playgroud)
它奏效了!然后我尝试使用它与SDL结构,但那些也有效.但是当我从它们派生类时,某些结构(特别是SDL结构)要么不编译或导致无法解释的运行时错误.所以我的问题是:推荐使用这种C结构吗?它实际上是专业人士使用的,还是只是一个蹩脚的黑客?我应该使用我的包装器还是应用程序,还是只会引入无法解释的错误?
我知道有一百万个关于单身人士的问题和答案,但我似乎找不到解决方案。因此,冒着投反对票的风险,这就是我的问题:
\n\n我想使用 Andrei Alexandrescu 现代 C++ 设计中的单例实现:
\n\n标头:
\n\nclass Singleton\n{\n static Singleton& Instance();\n private:\n Singleton(){};\n Singleton(const Singleton&){};\n Singleton& operator=(const Singleton&){};\n ~Singleton(){};\n};\nRun Code Online (Sandbox Code Playgroud)\n\n执行:
\n\n#include "s.hh"\n\nSingleton& Singleton::Instance()\n{\n static Singleton instance;\n return instance;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n测试:
\n\n#include "s.hh"\n\nint main(void)\n{\n Singleton& single = Singleton::Instance();\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n现在,
\n\n$g++ A.cc s.cc && ./a.out \nIn file included from A.cc:1:0:\ns.hh: In function \xe2\x80\x98int main()\xe2\x80\x99:\ns.hh:3:19: error: \xe2\x80\x98static Singleton& Singleton::Instance()\xe2\x80\x99 is private\n static Singleton& Instance();\n ^\nA.cc:6:42: error: within this context\n Singleton& single …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习C++,感谢这篇文章,我发现C++和Python以及Javascript之间存在许多相似之处:http://www.cse.msu.edu/~cse231/python2Cpp.html
但我根本无法理解C++类,它们看起来像Javascript原型,但并不那么容易.
例如:
//CLxLogMessage defined in header
class myLOG: public CLxLogMessage{
public:
virtual const char * GetFormat (){
return "Wavefront Object";
}
void Error (const std::string &msg){
CLxLogMessage::Error (msg.c_str ());
}
void Info (const std::string &msg){
CLxLogMessage::Info (msg.c_str ());
}
private:
std::string authoringTool;
};
Run Code Online (Sandbox Code Playgroud)
问题:这是什么公共/私人的东西!?
编辑:老实说,我比Python更喜欢C++,因为我可以学习所有内容的真实含义,而不是简单的自动命令,例如我更喜欢单独使用"int X"而不是"X".
谢谢
我有一个以下的C函数,
PRIVATE int func_name()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
"PRIVATE"在这里意味着什么?
所以我现在正在学习c ++类中的继承,并试图将所有术语都放在一边.我理解受保护和私有之间的区别.但是当你创造一个功能时,朋友与公开它不是一回事吗?
他们用来教导继承的例子是形状,所以:
class shape{
struct circle
struct rectangle
struct line
}
Run Code Online (Sandbox Code Playgroud)
这样的事情,说法之间有什么区别
class circle: shape
class circle: public shape
class circle: private shape (don't actually know if this one is possible)
Run Code Online (Sandbox Code Playgroud)
最后,关键字虚拟意味着/做/用于什么?谢谢
我正在Visual C++ 2010中编写一个小程序.
这是基类的代码:
class BaseInfo {
private:
std::map <std::string, std::string> info;
std::vector<std::string> extra_info_key;
public:
uint get_id ();
//Other function is hidden
};
uint BaseInfo::get_id () {
return (uint)atoi ((info["ID"]).c_str());
}
Run Code Online (Sandbox Code Playgroud)
然后我创建一个派生类,宣布为:
class test:BaseInfo {
public:
void f();
};
void test::f (test& inf) {
cout<<inf.get_id()<<endl;
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个错误:
函数"BaseInfo :: get_id无法访问.
我很困惑,似乎一切都在c ++规则中.
假设我有以下课程:
class Test
{
int num;
public:
Test(int x):num(x){}
Test(const Test &rhs):num(rhs.num+1){}
};
int main()
{
Test test(10);
Test copy = test;
}
Run Code Online (Sandbox Code Playgroud)
将num在副本应该是11,我的问题是关于拷贝构造函数里面,我们为什么不能访问私有成员num的test使用num来初始化num的副本?令我困惑的是,如果你输入cout<<test.num<<endl,当然这是错的,因为你试图访问私有num,但如果你通过参考复制构造函数传递测试,它可以工作,任何人都可以告诉我这里发生了什么?