考虑以下示例:
#include <iostream>
using namespace std;
class base
{
public:
virtual int func()
{
cout << "vfunc in base class\n";
return 0;
}
};
class derived: public base
{
public:
double func()
{
cout << "vfunc in derived class\n";
return 0;
}
};
int main()
{
base *bptr = new derived;
bptr->func();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器为上面的代码提供了一个错误,即覆盖函数存在冲突类型.为什么不能使用不同的返回类型覆盖派生类中的函数?
我相信,为了覆盖一个函数,需要在派生类中重新定义基类虚方法.要重新定义方法,方法的签名必须相同.由于返回类型不是签名的一部分,我相信即使返回类型有差异,该方法仍将被重新定义?在上述代码的情况下,func在派生类中使用不同的返回类型重新定义虚函数.但是编译器会抛出错误.我的理解是否正确?
之间有什么区别Swapping和Paging参考Process Memory Management?
如果有任何我可以获得更多信息的地方,也请指导我的教程.
我有一个安装在特定目录上的tmpfs文件系统.我想编写一个shell脚本来检查tmpfs文件系统是否已经挂载在目录中.
C++标准规定禁止从构造函数或析构函数中调用纯虚函数.这是什么原因?标准为什么要设置这样的限制?
我做了一些研究,找出为什么构造函数不能虚拟.我在这里巩固了我的理解.
我将首先解释什么是虚函数,然后根据第一个解释解释为什么构造函数不能是虚函数.
什么是virtual function?
虚函数是基类中的函数或方法,可以通过具有相同签名的函数在派生类中重新定义或覆盖.换句话说,虚函数允许在派生类中具有基类方法的自定义实现.它需要使用
virtual关键字声明.在虚函数调用时,决定在运行时选择函数定义的哪个版本(在基类或派生类中),具体取决于调用对象的类型(动态绑定).当函数声明为virtual时,它告诉编译器应该仅在运行时确定调用虚函数的对象的类型.然后根据对象的类型,函数调用应该绑定到函数定义,并且应该调用适当的函数.
为什么一个constructor不能虚拟?
当函数声明为virtual时,它告诉编译器应该仅在运行时确定调用该函数的对象的类型,然后根据对象的类型调用该函数的相应版本.
如果要将构造函数声明为virtual,它将告诉编译器应该在运行时确定将调用构造函数的对象类型.但是对于构造对象,应该在编译时而不是在运行时知道对象的确切类型.这就是构造函数不能虚拟的原因.
我希望SO成员纠正两个答案中的错误,如果有的话.我认为这对我和其他人有帮助,如果你可以通过重写它作为你的答案来纠正答案,而不是仅仅指出错误.
当静态成员变量在类中声明为private时,如何定义它?
假设我有以下类声明
class static_demo
{
private:
static int a;
public:
static int b;
void set(int x, int y)
{
a = x;
b = y;
}
void show()
{
cout << "a = " << a << "\n";
cout << "b = " << b << "\n";
}
};
Run Code Online (Sandbox Code Playgroud)
然后,要定义的以下语句a将导致编译错误.
int static_demo::a;
Run Code Online (Sandbox Code Playgroud)
那么有可能在类的私有部分中有一个静态数据成员吗?
根据Greg添加完整代码,
#include <iostream>
using namespace std;
class static_demo
{
private:
static int a;
public:
static int b;
void set(int x, int y)
{
a …Run Code Online (Sandbox Code Playgroud) 我有以下课程: -
class myclass
{
size_t st;
myclass(size_t pst)
{
st=pst;
}
operator int()
{
return (int)st;
}
int operator+(int intojb)
{
return int(st) + intobj;
}
};
Run Code Online (Sandbox Code Playgroud)
只要我像这样使用它,这个工作正常: -
char* src="This is test string";
int i= myclass(strlen(src)) + 100;
Run Code Online (Sandbox Code Playgroud)
但我无法做到这一点: -
int i= 100+ myclass(strlen(src));
Run Code Online (Sandbox Code Playgroud)
任何想法,我怎么能实现这个?
我的主目录中有一个符号链接ac到同一目录中的另一个文件.
ac - > bc
我知道如何使用shell脚本检查ac是一个符号链接
if [ -L /home/nit/a.c ] ; then
echo "a.c is a symbolic link"
fi
Run Code Online (Sandbox Code Playgroud)
但我的问题是如何编写一个shell脚本来检查ac是否是一个专门针对bc的符号链接?
谢谢
该pure virtual destructor基类应该有一个定义.否则编译器将在链接时生成从派生类析构函数调用基类析构函数,并将导致链接错误.
我试图在基类中定义纯虚拟析构函数,如下所示:
class base
{
public:
base()
{
cout << "constructor in base class\n";
}
virtual ~base()=0
{}
};
Run Code Online (Sandbox Code Playgroud)
这给出了编译错误:
错误:函数定义的纯指定符
然后我尝试在基类之外定义函数,如下所示:
class base
{
public:
base()
{
cout << "constructor in base class\n";
}
virtual ~base()=0;
};
base::~base()
{
}
Run Code Online (Sandbox Code Playgroud)
这将删除编译错误,它的行为与我的理解相同.
但我的问题是如何在基类之外定义纯虚拟析构函数来消除编译错误?
c++ ×7
constructor ×3
destructor ×2
pure-virtual ×2
shell ×2
filesystems ×1
inheritance ×1
mount ×1
operators ×1
overriding ×1
paging ×1
process ×1
redefinition ×1
swap ×1
symlink ×1
unix ×1